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增量
答案 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,所以你打印解决方案。如果你没有找到解决方案,那么调用堆栈结束并回退到前一个调用,这将保持循环,直到找到另一个可能的地方将女王放入该行。当它发生时,它会调用placeNqueens再次尝试下一行。如果存在解决方案,最终算法将尝试找到它所需的所有排列。
因此,总而言之,在placeNqueens的每次执行中,只要你需要循环直到找到放置王后的位置,然后再次调用placeNqueens,将当前行位置减少1,就会循环。你达到了一个不能放置任何皇后的程度,你的程序将完成整个for循环,然后返回,这将带你到前一次调用循环中的任何地方。