刚试验了一下出了新问题- -
比如,一开始是左边的数组,我想“把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;
}
}
代码可以再简化那么一点点
我表示没明白 题目是交换 为什么你里面要去掉? 到底是交换还是人为去掉特定?