Java 2D数组对角线

时间:2018-01-24 06:38:23

标签: java arrays bluej diagonal

我写了一个程序试图解决8皇后问题,其中一部分要求我测试所有前后对角线,以确保没有冲突。我得到了向后工作的完美,但前进的那部分在我测试时恢复了真实,我真的无法弄清楚为什么。非常感谢帮助:)

var full_text = 'ID: ' + aData[2] + '\\n' + 'NAME: ' +aData[4] + '\\n' + 'CRNCY: ' +aData[5] + '\\n' + 'Type: ' +aData[6] + '\\n' + 'Type2: ' +aData[7] + '\\n' + 'Sector: ' +aData[8] + '\\n' + 'Industry: ' +aData[9] + '\\n' + 'Security: ' +aData[10] + '\\n' + 'Stype2: ' +aData[11] + '\\n';

1 个答案:

答案 0 :(得分: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. 检查下方对角线。
  4. 我认为下面的例子更清楚:

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