Java 二维数组对角线
Java 2D array diagonals
我编写了一个程序来尝试解决 8 皇后问题,其中一部分要求我测试所有前向和后向对角线以确保没有冲突。我得到了向后完美的工作,但是在我测试的时候,前向的这一部分返回了 true,我真的不明白为什么。非常感谢您的帮助:)
class NonAttackingQueen {
static char [][] board = { {'X','X','X','X','X','X','X','X'},
{'X','X','X','X','X','X','X','X'},
{'X','X','X','X','X','X','X','X'},
{'X','X','X','X','X','X','X','X'},
{'X','X','X','X','X','X','X','X'},
{'X','Q','X','X','X','X','X','X'},
{'Q','X','X','X','X','X','X','X'},
{'X','X','X','X','X','X','X','X'} };
public static boolean diagonalsClear () {
int numQueens;
boolean clear = true;
for (int numSpots = 1; numSpots < 9; numSpots++) {
numQueens = 0;
for (int row = 0; row < numSpots - 1; row++) {
if (board[row][numSpots - 1 - row] == 'Q')
numQueens++;
}
if (numQueens > 1) {
clear = false;
break;
}
}
for (int numSpots = 7; numSpots > 0; numSpots--) {
numQueens = 0;
for (int row = 7; row > 7 - numSpots; row--) {
if (board[row][15-row-numSpots] == 'Q')
numQueens++;
}
if (numQueens > 1) {
clear = false;
break;
}
return clear;
}
}
解决这个问题的小技巧。很明显,您对矩阵 row
和 column
索引计算有误,并且您的循环没有覆盖其中的所有单元格。检查它的最简单方法,只需将其打印到控制台即可。我可以看出,您对 for (int row = 0; row < numSpots - 1; row++)
有疑问。第一次迭代,当 numSpots=1
它跳过这个循环。正确的是 for (int row = 0; row <= numSpots - 1; row++)
.
让我给你一些关于你的例子的注释。我可以看到你检查的矩阵的上下两个部分方向相反,上面的部分从 row=0
开始,下面的部分 - col=0
。我认为做同样的计算更有利于理解。您可以将您的任务分解为三个简单的一次:
- 检查一条对角线,从给定的
row
和 column
开始;
- 检查上对角线;
- 检查下对角线。
我认为下面的例子更便于阅读:
private static boolean isDiagonalClear(int row, int col) {
int total = 0;
do {
if (board[row--][col++] == 'Q')
total++;
} while (total <= 1 && row >= 0 && col < 8);
return total <= 1;
}
public static boolean diagonalsClear() {
for (int row = 0; row < 7; row++)
if (!isDiagonalClear(row, 0))
return false;
for (int col = 0; col < 8; col++)
if (!isDiagonalClear(7, col))
return false;
return true;
}
我编写了一个程序来尝试解决 8 皇后问题,其中一部分要求我测试所有前向和后向对角线以确保没有冲突。我得到了向后完美的工作,但是在我测试的时候,前向的这一部分返回了 true,我真的不明白为什么。非常感谢您的帮助:)
class NonAttackingQueen {
static char [][] board = { {'X','X','X','X','X','X','X','X'},
{'X','X','X','X','X','X','X','X'},
{'X','X','X','X','X','X','X','X'},
{'X','X','X','X','X','X','X','X'},
{'X','X','X','X','X','X','X','X'},
{'X','Q','X','X','X','X','X','X'},
{'Q','X','X','X','X','X','X','X'},
{'X','X','X','X','X','X','X','X'} };
public static boolean diagonalsClear () {
int numQueens;
boolean clear = true;
for (int numSpots = 1; numSpots < 9; numSpots++) {
numQueens = 0;
for (int row = 0; row < numSpots - 1; row++) {
if (board[row][numSpots - 1 - row] == 'Q')
numQueens++;
}
if (numQueens > 1) {
clear = false;
break;
}
}
for (int numSpots = 7; numSpots > 0; numSpots--) {
numQueens = 0;
for (int row = 7; row > 7 - numSpots; row--) {
if (board[row][15-row-numSpots] == 'Q')
numQueens++;
}
if (numQueens > 1) {
clear = false;
break;
}
return clear;
}
}
解决这个问题的小技巧。很明显,您对矩阵 row
和 column
索引计算有误,并且您的循环没有覆盖其中的所有单元格。检查它的最简单方法,只需将其打印到控制台即可。我可以看出,您对 for (int row = 0; row < numSpots - 1; row++)
有疑问。第一次迭代,当 numSpots=1
它跳过这个循环。正确的是 for (int row = 0; row <= numSpots - 1; row++)
.
让我给你一些关于你的例子的注释。我可以看到你检查的矩阵的上下两个部分方向相反,上面的部分从 row=0
开始,下面的部分 - col=0
。我认为做同样的计算更有利于理解。您可以将您的任务分解为三个简单的一次:
- 检查一条对角线,从给定的
row
和column
开始; - 检查上对角线;
- 检查下对角线。
我认为下面的例子更便于阅读:
private static boolean isDiagonalClear(int row, int col) {
int total = 0;
do {
if (board[row--][col++] == 'Q')
total++;
} while (total <= 1 && row >= 0 && col < 8);
return total <= 1;
}
public static boolean diagonalsClear() {
for (int row = 0; row < 7; row++)
if (!isDiagonalClear(row, 0))
return false;
for (int col = 0; col < 8; col++)
if (!isDiagonalClear(7, col))
return false;
return true;
}