在多维数组java中沿方向移动数字
Posted
技术标签:
【中文标题】在多维数组java中沿方向移动数字【英文标题】:Move numbers in directions in multidimensional array java 【发布时间】:2016-09-27 19:19:09 【问题描述】:我正在编写一个 2048 克隆(一个简单的克隆),我正在研究的方法是将多维数组中的数字尽可能沿指定方向滑动。我有这个向左滑动的代码,但我不知道如何让它向上、向下和向右滑动。
public void moveLeft(int[][] grid)
int [][] copy = grid;
for(int x = 0; x < copy.length; x++)
int[] row = new int[4];
for(int y = 0; y < copy[x].length; y++)
if (copy[x][y] != 0)
int temp = 0;
while(row[temp] != 0)
temp++;
row[temp] = copy[x][y];
copy[x] = row;
grid = copy;
有什么想法吗?非常感谢
【问题讨论】:
应该是moveUp(int[][] grid)
吗?因为你没有使用matriz
并且grid
没有在任何地方声明。
是的,我正在用西班牙语写作,但忘记翻译了。已编辑。
请记住,数组是对象而不是原始值。 copy
实际上不是副本。它是指向同一个对象的另一个引用。如果要复制它,则必须使用 clone()
或在两个 for 循环中手动执行。
哦,好的,我复制了一份,以备后用,看看板子有没有变化。忽略那个。该方法可以完美地向左滑动,但我想要的是能够向其他方向滑动,我不知道如何。谢谢。
理解你的代码并不容易。这不是很直接,而且你没有 cmet 解释你在做什么。此外,该方法称为moveUp()
,但您正在使用它向左移动?
【参考方案1】:
如 cmets 中所述,请考虑您将如何使用 copy
变量和 clone()
解决方案基于您的代码。我稍作改动,这样当相同的数字(2、4、8 等)彼此相邻时,您可以实现加法:
public void moveLeft(int[][] grid)
int [][] copy = grid.clone();
for(int x = 0; x < copy.length; x++)
int[] row = new int[4];
for(int y = 0; y < copy[x].length; y++)
if (copy[x][y] != 0)
int temp = 0;
while(row[temp] != 0)
temp++;
row[temp] = copy[x][y];
for(int k=0; k<row.length-1; k++)
if(row[k] == row[k+1])
row[k] = row[k]+row[k+1];
row[k+1] = 0;
copy[x] = row;
for(int x = 0; x < copy.length; x++)
int[] row = new int[4];
for(int y = 0; y < copy[x].length; y++)
if (copy[x][y] != 0)
int temp = 0;
while(row[temp] != 0)
temp++;
row[temp] = copy[x][y];
copy[x] = row;
grid = copy;
如果你运行它:
int[][] b = 0, 2, 0, 2,2, 2, 0, 8,4, 4, 4, 2,4, 2, 4, 2;
moveLeft(b);
你会得到以下结果:
4 0 0 0
4 8 0 0
8 4 2 0
4 2 4 2
【讨论】:
谢谢,我有一个单独的添加方法,然后我再次移动,这基本上就是你的方法所做的。我也希望能够上下左右移动。我最后做的是旋转阵列,向左移动,然后再次旋转到原始位置。 @Paw 我会保持方法不变。如果要向下移动元素,则必须将数组向右旋转。因此,如果第一列将成为第一行,例如在我发布在列 [0,2,4,4] 上方的数组 b 中,则必须成为第一行,并且对于数组的休息日期相同。之后你运行 moveLeft(b);然后将阵列旋转回其先前的状态。对于“moveRight(b)”(旋转两次,运行 moveLeft)和“moveUp(b)”(旋转 3 次,运行 moveLeft),您必须做同样的事情。以上是关于在多维数组java中沿方向移动数字的主要内容,如果未能解决你的问题,请参考以下文章