修改后的 N Queens 和 placed queen
Modified N Queens with placed queen
我正在使用回溯创建 N Queens 问题求解器。然而,扭曲是第一个皇后由用户放置,然后回溯 运行 处理其他 7 个皇后。我的程序可以完成此任务并且回溯功能正常,但我只能将皇后放在左第一列,因为函数采用的参数是开始回溯过程的列。
董事会class
public boolean solveQueen(int col) {
if (col >= board.length) {
printBoard();
System.out.println("queen");
return true;
}
for (int i = 0; i < board.length; i++)
if (notUnderAttack(i, col)) {
placeQ(i, col);
solveQueen(col + 1);
removeQ(i, col);
}
return false;
}
主要class
queen.placeQ(0, 2);
queen.solveQueen(3);
queen.printBoard();
为了解决这个问题,我尝试绕过第一个皇后并在初始放置后开始回溯一列,但这里的问题是,虽然它将皇后放在 3、4、5、6、7 列并且预置的皇后在第二列,第一列没有皇后。我不太确定如何在第一列中添加女王。我试过使用模数,但我不确定我是否正确实现了它,所以我删除了它。
public boolean notUnderAttack(int row, int col) {
if ((rowCheck(row) == false) || (colCheck(col) == false) || (diagonalCheck(row, col) == false)) {
return false;
}
return true;
}
您可以存储初始皇后的列,然后跳过该列 solveQueen
。要么。创建一个方法来检查列中是否有皇后并根据它跳过。然后总是只调用 solveQueen(1)
如果你只想放置第一个皇后,第一个解决方案是好的(更有效)。第二个更好,如果你可以扩展它来处理多个放置的初始皇后。
我正在使用回溯创建 N Queens 问题求解器。然而,扭曲是第一个皇后由用户放置,然后回溯 运行 处理其他 7 个皇后。我的程序可以完成此任务并且回溯功能正常,但我只能将皇后放在左第一列,因为函数采用的参数是开始回溯过程的列。
董事会class
public boolean solveQueen(int col) {
if (col >= board.length) {
printBoard();
System.out.println("queen");
return true;
}
for (int i = 0; i < board.length; i++)
if (notUnderAttack(i, col)) {
placeQ(i, col);
solveQueen(col + 1);
removeQ(i, col);
}
return false;
}
主要class
queen.placeQ(0, 2);
queen.solveQueen(3);
queen.printBoard();
为了解决这个问题,我尝试绕过第一个皇后并在初始放置后开始回溯一列,但这里的问题是,虽然它将皇后放在 3、4、5、6、7 列并且预置的皇后在第二列,第一列没有皇后。我不太确定如何在第一列中添加女王。我试过使用模数,但我不确定我是否正确实现了它,所以我删除了它。
public boolean notUnderAttack(int row, int col) {
if ((rowCheck(row) == false) || (colCheck(col) == false) || (diagonalCheck(row, col) == false)) {
return false;
}
return true;
}
您可以存储初始皇后的列,然后跳过该列 solveQueen
。要么。创建一个方法来检查列中是否有皇后并根据它跳过。然后总是只调用 solveQueen(1)
如果你只想放置第一个皇后,第一个解决方案是好的(更有效)。第二个更好,如果你可以扩展它来处理多个放置的初始皇后。