因此,我正在使用Backtracking创建一个N Queens问题解决程序。然而,不同之处在于,第一个皇后由用户放置,然后运行回溯以处理其他七个皇后。我的程序可以执行此任务,并且回溯功能正常,但是我只能将女王/王后放在左第一列,因为该功能所采用的参数是开始回溯程序的列。
董事会课程
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;
}
主班
queen.placeQ(0, 2);
queen.solveQueen(3);
queen.printBoard();
因此,为解决此问题,我尝试环绕第一个皇后并在初始放置后开始回溯一列,但是这里的问题是,尽管将皇后放在第3、4、5、6、7列,预先放置的皇后在第二列,第一列没有皇后。我不太确定如何在第一栏中添加女王。我尝试使用模数,但是不确定是否正确实现了模数,所以我将其删除。
布尔布尔值notUnderAttack(int row,int col){
if ( (rowCheck(row) == false) || (colCheck(col) == false) || (diagonalCheck(row, col) == false) ) {
return false;
}
return true;
}
答案 0 :(得分:0)
您可以存储首个皇后的列,然后跳过该列solveQueen
。要么。创建一个方法,该方法已经在该列中检查了一个女王/王后,并根据此跳过。然后,如果您只想放置第一个皇后,则始终只需致电solveQueen(1)
,第一个解决方案是不错的(效率更高)。如果您可以扩展它以处理多个放置的初始皇后,则第二个更好。