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

问题描述

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

刚试验了一下出了新问题- -
比如,一开始是左边的数组,我想“把2个0去掉,然后0上面的2就掉下来了”,形成右边的新数组

然后我用了循环遍历,比如只看第二列,我的做法是“从下往上找,遇到0,就和0上面的数字交换”,结果成了下面这个样子了- -

我有个改进想法是“还是从下往上找,遇到0之后判断上面的是不是0,如果是0,再继续向上再找,直到不是0,然后把这个数赋值给一开始那个0的位置”,但是折腾半天没写出来...
您能帮忙看下这个问题怎么写吗?谢谢~

解决方案

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

解决方案二:

 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[] { "rn" }, 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;
                }
            }

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

解决方案五:

这是设计消除游戏算法?还是俄罗斯方块?如果是俄罗斯方块其实判断和算法更简单,消除则比方块要复杂些。
按列往方向找遇非0则交换并记住交换后0的位置,第一次交换后会遇到2次0后才遇到非0则与记录的第一个0位交换,这个判断代码应该不难,思路分析好了写代码就不难了。
int a=0,c=0,d=0;
do
{
if(b[c,1]==0)d=c;else {b[d,1]=b[c,1];d=c;}
}whlie(++c<数组维度数);
假设从下往上,且序从0始,则当c为1,b[1,1]==0时d=1,c为2,b[2,1]!=0时交换并记录d=2,继续往上找直遇到非0交换。
按理写代码你自己测试去,我的构思是可以把这个列处理独立写一个函数。

解决方案六:

依据之上写的思路代码,最后调试修改:5*5数组
int c = 4, d = -1;
do
{
if (b[c, 1] == 0) if (d < 0) d = c;
else if (d >= 0) { b[d, 1] = b[c, 1]; b[c, 1] = 0; d = c; }
} while (--c >= 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();
            }

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

时间: 2024-09-17 04:09:53

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

逆序二维数组插入一元素的php代码_php技巧

复制代码 代码如下: <?php /** * 逆序二维数组插入一元素 * * @author WadeYu * @date 2012-05-30 */ $aSorted = array( array(1, 100), array(2, 90), array(3, 80), array(4, 70), array(5, 60), array(6, 50), array(7, 40), array(8, 40), array(9, 40), array(10, 20), ); $aInsert =

php二维数组合并与元素值相加实例

php教程二维数组合并与元素值相加实例 */ $arr_click = array(     array('date' => '2010-10-01', 'click' =>'1'),     array('date' => '2010-10-02', 'click' =>'2'),     array('date' => '2010-10-02', 'click' =>'3'),     array('date' => '2010-10-03', 'click'

求助-数据结构二维数组问题

问题描述 数据结构二维数组问题 设二维数组A[1...m,1...n]按行存储在数组B中,则二维数组元素A[i,j]在一维数组B中的下标为() A.n*(i-1)+j B.n*(i-1)+j-1 C.i*(j-1) D.j*m+i-1 答案是A,想知道具体的做法和计算过程,谢谢了 解决方案 m行n列,每行有n个,下标(i,j),就是第i行从左至右第j个的位置,而从第一到第i-1行每行都有n个,已经有n*(i-1)个,所以再加上第i行的j就是了 解决方案二: 二维数组作为参数传递问题 解决方案三:

剑指offer系列之三:在二维数组中查找元素

题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 由于题目条件的成立,所以使得这道题可以使用对角线的方法完成,可以从右上角的元素考虑,如果目标查找元素小于右上角的元素,那么不可能在右上角元素所在的列,如果目标大于剩余列的右上角的元素,那么不可能在该右上角元素所在的行.依照这个规律,就可以完成目标元素的查找(参考剑指offer书中的思路).基于此,我写出如下的代码(已被

删除去除二维数组中相同元素与数组重复值实例

$list = array(         array('id'=>107,'title'=>'aaa'),         array('id'=>106,'title'=>'bbb'),         array('id'=>105,'title'=>'ccc'),         array('id'=>104,'title'=>'ccc'),         array('id'=>103,'title'=>'ddd'),      

二维数组的认识及其表示元素的两种方式

/* ============================================================================ Name : TeatArr.c Author : lf Version : Copyright : Your copyright notice Description : 二维数组的认识以及其表示元素的两种方式 备注说明 1 要理解二维数组的存储方式. 2 实际上利用a[i][j]的方式并不"正统",但这靠近我们的 常识一些,

C语言及程序设计提高例程-33 二维数组元素的引用

贺老师教学链接  C语言及程序设计提高 本课讲解 输入输出二维数组元素 #include <stdio.h> int main() { int s[3][5], i, j; printf("Input 3*5 numbers\n"); for (i=0; i<3; i++) for(j=0; j<5; j++) scanf("%d", &s[i][j]); for (i=0; i<3; i++) { for(j=0; j<

php二维数组多元素排序例子

写个二维数组的多元素排序,多元素排序类似sql中的order by sort,date,下面代码考虑性能问题,只涉及2个元素进行排序. 代码区: function multipleArraySort($old_arr,$arr1,$arr2){ //排序第一个元素 $old_arr = array_sort($old_arr,$arr1[0],$arr1[1]); $temp_array = $new_temp_array = array(); foreach($old_arr as $k =>

详解C++中的一维数组和二维数组_C 语言

C++一维数组 定义一维数组 定义一维数组的一般格式为:     类型标识符  数组名[常量表达式]; 例如: int a[10]; 它表示数组名为a,此数组为整型,有10个元素. 关于一维数组的几点说明: 1) 数组名定名规则和变量名相同,遵循标识符定名规则. 2) 用方括号括起来的常量表达式表示下标值,如下面的写法是合法的: int a[10]; int a[2*5]; int a[n*2]; //假设前面已定义了n为常变量 3) 常量表达式的值表示元素的个数,即数组长度.例如,在"int