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;
    }
}

解决这个问题的小技巧。很明显,您对矩阵 rowcolumn 索引计算有误,并且您的循环没有覆盖其中的所有单元格。检查它的最简单方法,只需将其打印到控制台即可。我可以看出,您对 for (int row = 0; row < numSpots - 1; row++) 有疑问。第一次迭代,当 numSpots=1 它跳过这个循环。正确的是 for (int row = 0; row <= numSpots - 1; row++).

让我给你一些关于你的例子的注释。我可以看到你检查的矩阵的上下两个部分方向相反,上面的部分从 row=0 开始,下面的部分 - col=0。我认为做同样的计算更有利于理解。您可以将您的任务分解为三个简单的一次:

  1. 检查一条对角线,从给定的 rowcolumn 开始;
  2. 检查上对角线;
  3. 检查下对角线。

我认为下面的例子更便于阅读:

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;
}