【发布时间】:2016-09-30 21:15:31
【问题描述】:
我写了一个 N-Queens 谜题的 Java 小算法(带有一个 c*c 棋盘)。您将在下面找到我的递归方法的代码。
它没有找到所有的解决方案。
我的功能是什么
这个想法是,在 main 方法中,第一次调用我的函数,给它最大数量的皇后,直到找到解决方案,没有任何皇后的棋盘和这些新皇后的坐标:x=0,y =0。
该函数将通过棋盘。对于每个方格,它测试是否可以放置皇后(0;0)(即:没有威胁)。女王(0;0)可以放置吗?好吧,我们这样做(修改棋盘)并调用函数(递归调用)。这个递归调用是通过“皇后的最大数量 - 1”、修改后的棋盘和“新皇后的 y + 1”(稍微复杂一点)来完成的。
找到 n=4 和 c=4 的解决方案(通常有两个解决方案...!)
&&Q&
问&&&
&&&Q
&Q&&
我的函数的最新代码
private static void setQueen(int nb_queens, ArrayList<ArrayList<Boolean>> chessboard, int x, int y, ArrayList<ArrayList<ArrayList<Boolean>>> solutions) {
if (nb_queens == 0) { // If there isn't any queen remaining, it means we found a solution
drawChessboard(chessboard);
solutions.add(chessboard);
}
for(int i = x; i < chessboard.size(); i++) {
for (int z = y; z < chessboard.get(i).size(); z++) {
if(!canBePlaced(i, z, chessboard)) {
chessboard.get(z).set(i, true); // On peut donc placer cette reine(x;y) et on le fait
setQueen(nb_queens-1, chessboard, i+1, 0, solutions);
chessboard.get(z).set(i, false);
}
}
}
}
旧代码
private static void setQueen(int nb_queens, ArrayList<ArrayList<Boolean>> chessboard, int x, int y, ArrayList<ArrayList<ArrayList<Boolean>>> solutions) {
if (nb_queens == 0) {
drawChessboard(chessboard); // Il n'y a plus de reine à placer => on dessine cette solution
solutions.add(chessboard);
}
for(int i = x; i < chessboard.size(); i++) {
for (int z = y; z < chessboard.get(i).size(); z++) {
if(!isAQueenAlreadyPresent(i, z, chessboard)) {
chessboard.get(z).set(i, true); // On peut donc placer cette reine(x;y) et on le fait
setQueen(nb_queens-1, chessboard, i, (z+1 >= WIDTH) ? 0 : z+1, solutions);
chessboard.get(z).set(i, false);
}
}
}
}
【问题讨论】:
-
它是否找到任何解决方案?结果是什么?另外,放
isAQueenAlreadyPresent(i, z, chessboard),应该没问题,但谁知道呢。此外,同时使用递归和迭代并不是很有用... -
我编辑了 OP 以显示结果 :)
-
啊,是的,现在我明白为什么递归和迭代了。但实际上似乎缺少很多结果,不是还有很多吗?像,这些解决方案的对称性?像 &&Q &&& &Q& 与你的第一个结果对称。
-
是的,缺少很多解决方案。我不明白为什么。我不认为这是因为
isQueenAlreadyPresent。 -
可以添加这个函数的代码吗?