- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了一个 N-Queens 难题的 Java 小算法(使用 c*c 棋盘)。您将在下面找到我的递归方法的代码。
它没有找到所有的解决方案。
这个想法是在主方法中第一次调用我的函数,给它最大数量的皇后,直到找到解决方案,没有任何皇后的棋盘和这些新皇后的坐标:x=0,y =0。
该函数将遍历棋盘。对于每个方格,它测试是否可以放置皇后(0;0)(即:没有威胁)。可以放置皇后(0;0)吗?好吧,我们这样做(修改棋盘)并调用该函数(递归调用)。此递归调用是通过以下内容完成的:“皇后的最大数量 - 1”、修改后的棋盘和“新皇后的 y + 1”(稍微复杂一点)。
&&问&
问&&&
&&&问
&问&&
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);
}
}
}
}
最佳答案
哦,对了,那是因为你如何递归调用,你在做什么setQueen(nb_queens-1, chessboard, i, z+1, solutions);
。 z+1
部分是问题,它总是会在您放置在全局板上的第一个皇后的右侧找到解决方案。
编辑:啊,你以前发现过它,很好。
所以,问题在于 for 循环充当 if(z>=y)
因为它从 y
开始。没事的时候i = x
(阅读第一行),但不是在 i > x
时。因此,一个简单的解决方法是输入 y = ( i == x ) ? y : 0
就在第一个for
之后循环。
还有更简洁的解决方案,例如使用单个索引来遍历整个棋盘。
我还建议您将参数重命名为 startX 和 startY(而不是 x 和 y,您可以在循环中使用 x 和 y 来更清晰)。
编辑2:由于游戏规则,同一行上永远不会有皇后,因此您可以进行递归调用,如 setQueen(nb_queens-1, chessboard, i+1, 0, solutions);
( i+1
因为您直接从下一行开始)。因此,您甚至可以删除 int y
来自 setQueen
的参数方法并始终启动 z loop
为 0。
关于java - 递归 N 皇后 : missing solutions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39791116/
最初的 N-Queen 问题是关于在 N*N 棋盘上放置 N 个皇后。 然而,我却被一位学界 friend 质疑: 有预定义皇后的 N 皇后问题的 NP 完备性证明吗? 定义是: 假设: N = 8,
我正在尝试解决 N 皇后问题。您可以在 https://leetcode.com/problems/n-queens/ 中找到问题. 对于回溯,我了解到我们可以用三个关键来解决问题: 做出选择 约束
我正在用 Java 制作国际象棋游戏。 我做了一个 JFrame,它可以让我创建棋子,这就是为什么我对任何棋子都有所有可能的走法(并且我将制作比正常国际象棋中更多的棋子)。 但是我有一个小问题,我已经
我编写了一个 N-Queens 难题的 Java 小算法(使用 c*c 棋盘)。您将在下面找到我的递归方法的代码。 它没有找到所有的解决方案。 我的功能是什么 这个想法是在主方法中第一次调用我的函数,
我写了两个程序: 通过回溯算法在没有任何威胁的情况下将 n 个皇后放在棋盘上。但这对于 big n 来说非常沉重。最后你可以运行 100 个皇后。 在没有任何爬山算法威胁的情况下,将 n 个皇后放在棋
我是一名优秀的程序员,十分优秀!