有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java二维数组对角线

我写了一个程序试图解决8皇后问题,其中一部分要求我测试所有的前后对角线,以确保没有冲突。我得到了完美的反向工作,但这一部分的向前一个是返回真实的,而我正在测试,我真的不明白为什么。我们将非常感谢您的帮助:)

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

共 (1) 个答案

  1. # 1 楼答案

    解决这个问题的小技巧。很明显,您在计算矩阵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;
    }