嗨,我正在开发一个简单的 L 游戏。我想水平从左到右翻转数组。例如,
{ 'x',' ',' ',' ' },
{ 'x',' ',' ',' ' },
{ 'x','x',' ',' ' },
{ ' ',' ',' ',' ' }
我想把它翻转到
{ ' ','x',' ',' ' },
{ ' ','x',' ',' ' },
{ 'x','x',' ',' ' },
{ ' ',' ',' ',' ' }
这是我当前的代码
public void flipArray() {
int rows = cells.length;
int cols = cells[0].length;
char temp[][] = new char[rows][cols];
for (int i = rows-1; i>=0; i--) {
for (int j = cols-1; j>=0; j--) {
temp[rows-1-i][cols-1-j] = cells[i][j];
}
}
for (int i=0; i<rows; i++) {
for (int j=0; j<cols; j++) {
System.out.print(temp[i][j] + " ");
}
}
}
非常感谢您的帮助,非常感谢。 这就是我想要的结果。
rand_seed = 14427 rand_seed = 14427
$ LGame.main({}) $ LGame.main({})
A i i A i i
o i o i
o i o i
o o B o o B
Move: o101 Move: o101
A i i A i i
o i | o i
o i | o i
o o B o o B
最佳答案
你的代码是如此复杂,我什至没有试图理解它。如果将问题分解为子问题,问题就会变得更简单、更容易掌握。
首先是基本构建 block ,反转单个数组:
static void flip(char[] array) {
int left = 0;
int right = array.length - 1;
while (left < right) {
char temp = array[left];
array[left] = array[right];
array[right] = temp;
++left;
--right;
}
}
现在您只需遍历行数组并为每一行调用翻转:
static void flip(char[][] rows) {
for (char[] row : rows) {
flip(row);
}
}
当你把它分解成更小的问题时,你会发现它非常简单。
编辑: 在二维数组中找到“L”的边界框可以再次分解为更小的问题。您可以遍历行,检查它们是否完全为空,如果不是,则找到“设置”单元格的最小和最大索引。为简单起见,我在两个嵌套循环中用一种方法执行此操作:
static int[] getBoundingBox(char[][] rows) {
int minY = Integer.MAX_VALUE;
int maxY = Integer.MIN_VALUE;
int minX = Integer.MAX_VALUE;
int maxX = Integer.MIN_VALUE;
for (int y=0; y<rows.length; ++y) {
// find the rows min/max populated index
char[] row = rows[y];
int rowMinX = Integer.MAX_VALUE;
int rowMaxX = Integer.MIN_VALUE;
for (int x=0; x<row.length; ++x) {
if (row[x] == 'x') {
rowMinX = Math.min(rowMinX, x);
rowMaxX = Math.max(rowMaxX, x);
}
}
// check if the row is empty (min > max)
if (rowMinX > rowMaxX) {
// empty row, skip
continue;
}
// update bounding box variables
minY = Math.min(minY, y);
maxY = Math.max(maxY, y);
minX = Math.min(minX, rowMinX);
maxX = Math.max(maxX, rowMaxX);
}
// result is an array containing the bounds
return new int[] { minX, minY, maxX, maxY };
}
您现在应该真的能够将各个部分连接起来。
Edit2:剩下要做的就是修改 Flip(rows[][]) 以获取边界,并为 minY 和 maxY 之间的行调用 Flip(row[]) 。然后,行翻转需要从边界传递最小/最大 X,并使用传递的值而不是左/右的 0/长度。想一想,稍微想一想就很明显了。
题外话,但您可能仍在学习这一点:将代码拆分为每个仅解决一个子问题的小方法的原因是您可以a)重复使用它们来解决相同的问题b) 方法中的代码越少,就越容易验证它的作用以及它是否有效。将所有内容打包在一个大方法中会使其更难以理解,并且当您需要在其他地方解决部分问题时,您将重复代码(和工作)。
关于java - 如何在Java中翻转二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19619165/