问题描述
- 求助一道二维数组交换特定元素位置的算法题,谢谢大家!
-
刚试验了一下出了新问题- -
比如,一开始是左边的数组,我想“把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();
}
我被困在了“怎样向上找到下一个非零数字,然后把这个数沉下来”这里了