求助一道二维数组交换特定元素位置的算法题,谢谢大家!

刚试验了一下出了新问题- -
比如,一开始是左边的数组,我想“把2个0去掉,然后0上面的2就掉下来了”,形成右边的新数组
图片说明
然后我用了循环遍历,比如只看第二列,我的做法是“从下往上找,遇到0,就和0上面的数字交换”,结果成了下面这个样子了- -
图片说明
我有个改进想法是“还是从下往上找,遇到0之后判断上面的是不是0,如果是0,再继续向上再找,直到不是0,然后把这个数赋值给一开始那个0的位置”,但是折腾半天没写出来...
您能帮忙看下这个问题怎么写吗?谢谢~

6×6大小...手误
就是说,如何把图中画圈位置上方的2下降到1的正上方?

你是简单的进行两个数的交换??还是每一列的第一个和最后一个都要交换?

请把你的代码贴出来,并且把问题说清楚,否则没法回答你的问题。“刚试验了一下出了新问题- -”请把你的旧问题也贴出来。

@caozhy
问题是这样的:
像题目说的那样,我想把第一张图左边的数组里面第二列的2个0“拿掉”,然后让这2个0上面的数组2“下沉下来”,形成第一张图右边的这个数组。
然后,我在写的时候想法比较简单,于是用了“从下到上遍历,如果当前位置是0,那就和上面的那个位置的数字做交换“,来实现上面说的那样"让非零数字下沉下来"

我写的方法是这样的(有BUG,不会修改...)

            int topNum = 0;
            for (int iii = rowNum - 1; iii > 0; iii--)
            {
                for (int jjj = 0; jjj < colNum; jjj++)
                {
                    if (map[iii, jjj] == 0)//如果当前位置值是0
                    {
                        //map[iii, jjj] = 7;
                        if (map[iii - 1, jjj] != 0)//如果上面的数不等于0
                        {
                            map[iii, jjj] = map[iii - 1, jjj];//把上面的数给这里
                            map[iii - 1, jjj] = 0;//上面的数设为0
                        }
                        else//如果上面的数等于0,【再往上找】
                        {
                            while (map[iii, jjj] == 0)
                            {
                                if (map[iii - 1, jjj] != 0)
                                {
                                    map[iii + topNum, jjj] = map[iii - 1, jjj];
                                }
                                else
                                {
                                    iii--;
                                    topNum++;
                                }
                            }
                        }
                    }
                    Console.Write(map[iii, jjj] + " ");
                }
                Console.WriteLine();
            }

我被困在了“怎样向上找到下一个非零数字,然后把这个数沉下来”这里了

这是c#吗?好久没用过了,我的话大致会这样写:

    int topNum = 0;
    //这里还是从第0行还是比较好,相当于一层一层把0给挤上去
    for (int iii = 0; iii < rowNum; iii++)
    {
        for (int jjj = 0; jjj < colNum; jjj++)
        {
            //搜索到0了,则进行向上的搜索
            if (map[iii, jjj] == 0)
            {
                //向上查找非0的数进行交换下沉
                for (int i = iii - 1; i>=0; i--) {
                    if (map[i, jjj] != 0) {
                        map[i+1, jjj]= map[i, jjj];
                        map[i, jjj] = 0;
                    }
                    else {
                        break;
                    }
                }
            }

            Console.Write(map[iii, jjj] + " ");
        }
        Console.WriteLine();
    }

思想的话类似于冒泡的方法,遇到0,则将其向上层依次与非0的数交换上浮,遇到如果上层是0的话,则停止交换,说明上面全部都是0了。
代码我是用c编写测试的,最后改成你需要的语言的版本,你可以测一下看看行不行

 using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string data = @"
4 2 3 3 2
4 0 1 1 2
3 2 3 2 4
2 0 1 3 2
2 3 3 2 4
";
            string[] lines = data.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
            int[,] map = new int[lines.GetLength(0), lines[0].Split(' ').GetLength(0)];
            for (int i = 0; i < map.GetLength(0); i++)
            {
                string[] line = lines[i].Split(' ');
                for (int j = 0; j < map.GetLength(1); j++)
                {
                    map[i, j] = int.Parse(line[j]);
                }
            }

            int n = 0;
            for (int i = 0; i < map.GetLength(0); i++)
            {
                if (map[i, 1] == 0)
                {
                    int temp = map[n, 1];
                    map[n, 1] = map[i, 1];
                    map[i, 1] = temp;
                    n++;
                }
            }

            for (int i = 0; i < map.GetLength(0); i++)
            {
                for (int j = 0; j < map.GetLength(1); j++)
                {
                    Console.Write(map[i, j] + " ");
                }
                Console.WriteLine();
            }
        }
    }
}

4 0 3 3 2
4 0 1 1 2
3 2 3 2 4
2 2 1 3 2
2 3 3 2 4
Press any key to continue . . .

             int n = 0;
            for (int i = 0; i < map.GetLength(0); i++)
            {
                if (map[i, 1] == 0)
                {
                    map[i, 1] = map[n, 1];
                    map[n++, 1] = 0;
                }
            }

代码可以再简化那么一点点

我表示没明白 题目是交换 为什么你里面要去掉? 到底是交换还是人为去掉特定?