【问题标题】:Java 2D array diagonalsJava 2D 数组对角线
【发布时间】:2018-07-03 03:07:32
【问题描述】:

我编写了一个程序来尝试解决 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;
    }
}

【问题讨论】:

  • 首先,初始化变量int numQueens=0 的好习惯;其次,isDiagonalsClear() 遵循 Java 的 bool-returning 函数约定。
  • 如果您将 ifs (numQueens > 1) 更改为返回 false 而不是写入变量,它应该可以正常工作。我认为在你的情况下 clear 在第二个循环中被覆盖。

标签: java arrays bluej diagonal


【解决方案1】:

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

【讨论】:

  • 如果点数是 1,那么检查对角线是否有第二个皇后并不重要吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-15
  • 1970-01-01
相关资源
最近更新 更多