4皇后算法 - 无法理解代码

时间:2014-12-11 21:14:44

标签: java

public boolean canPlaceQueen(int r, int c) {
    /**
     * Returns TRUE if a queen can be placed in row r and column c.
     * Otherwise it returns FALSE. x[] is a global array whose first (r-1)
     * values have been set.
     */
    // System.out.println("r======"+r);
    // System.out.println("c="+c);
    for (int i = 0; i < r; i++) {
        System.out.println("iiiiiiiiiii="+i);
        if (x[i] == c || (i - r) == (x[i] - c) ||(i - r) == (c - x[i]))
        {
             System.out.println("try c="+c);
             System.out.println("try="+r);
            return false;

        }
    }
    return true;

}

public void placeNqueens(int r, int n) {
    /**
     * Using backtracking this method prints all possible placements of n
     * queens on an n x n chessboard so that they are non-attacking.
     */
    //System.out.println("r="+r);
    for (int c = 0; c < n; c++) {
        //System.out.println("c=="+c);
        if (canPlaceQueen(r, c)) {
            x[r] = c;
           // System.out.println("2nd==="+r);
            if (r == n - 1) {
                printQueens(x);
            } else {
                placeNqueens(r + 1, n);
            }
        }
    }
}

我的问题是:如果c = 0,则c = 1,然后c = 0。我无法理解这个逻辑,为什么不是c = 2,请描述它或描述这个程序中c增量

1 个答案:

答案 0 :(得分:0)

好的,我会对此嗤之以鼻。你输入方法placeNqueens,r = 0,n = whatever(比方说5)。我们循环遍历每一列,检查我们是否可以在该列的行中插入一个女王。如果我们可以放置它,我们设置x [0] = c(第一次尝试可能为0),然后以r = 1和n = 5递归调用placeNqueens。此时我们正在检查下一行。

在此次通话中,我们现在重新开始并检查所有列。我们将无法将它放在第一列中,因为这是第一列的位置,所以我们循环直到找到可以放置它的列。在这个循环中,你可以检查第0列并失败,然后检查第1列并失败,然后检查第2列并找到一个点,所以你设置x [1] = 2然后调用placeNqueens(6,5)。 / p>

最终你已经放置了足够的皇后你的行==皇后-1,所以你打印解决方案。如果你没有找到解决方案,那么调用堆栈结束并回退到前一个调用,这将保持循环,直到找到另一个可能的地方将女王放入该行。当它发生时,它会调用pl​​aceNqueens再次尝试下一行。如果存在解决方案,最终算法将尝试找到它所需的所有排列。

因此,总而言之,在placeNqueens的每次执行中,只要你需要循环直到找到放置王后的位置,然后再次调用placeNqueens,将当前行位置减少1,就会循环。你达到了一个不能放置任何皇后的程度,你的程序将完成整个for循环,然后返回,这将带你到前一次调用循环中的任何地方。