Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带放置皇后的修改N皇后_Java_N Queens - Fatal编程技术网

Java 带放置皇后的修改N皇后

Java 带放置皇后的修改N皇后,java,n-queens,Java,N Queens,我正在创建一个具有回溯功能的N Queens问题解决程序。然而,问题在于,第一个皇后由用户放置,然后运行回溯来处理其他7个皇后。我的程序执行此任务,回溯功能正常,但我只能将皇后放置在左第一列,因为函数所采用的参数是开始回溯过程的列 板级 public boolean solveQueen(int col) { if (col >= board.length) { printBoard(); System.out.println("que

我正在创建一个具有回溯功能的N Queens问题解决程序。然而,问题在于,第一个皇后由用户放置,然后运行回溯来处理其他7个皇后。我的程序执行此任务,回溯功能正常,但我只能将皇后放置在左第一列,因为函数所采用的参数是开始回溯过程的列

板级

 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;         
 }
为了解决这个问题,我尝试环绕第一个皇后,并在初始放置后开始回溯a列,但这里的问题是,虽然它将皇后放置在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; 
}

您可以存储初始queen的列,然后跳过该列
solveQueen
。或创建一个方法,该方法检查列中是否已存在皇后,并基于此跳过。然后始终只需调用
solveQueen(1)
如果您只想放置第一个queen,那么第一个解决方案是好的(更有效)。第二个更好,如果您可以扩展它来处理多个放置的初始皇后

那么,据我所知,我只是想跳过女王的专栏?这是否是一个if语句,其中我跟踪另一个queen place函数中的列,该函数专门用于放置queen,然后在其中使用if语句跳过该语句?是的,基本上,solveQueen的第一行应该是'if(col==firstQueenCol){solveQueen(col+1);}`或者代替col==fQCol,您可以让它调用一个方法,如果col中已经有一个queen,那么该方法将返回boolean。Mhm,尝试了一下,它工作得很好,唯一的问题是,由于列没有被放置,而是被跳过,我发现前面的行有对角线冲突,所以我猜这是因为它没有先发制人地检测放置的皇后。我需要另一个if语句,从我猜的答案中排除这个答案?是的,可能会显示notUnderAttack()的内容。您可能需要修改该方法以检查所有列,而不是只检查主消息中以前的所有列,因为现在是对角线检查似乎不起作用,因为列/行检查正在正常工作。我只是将文本中意外出现的一行代码移到了它所属的代码块中。PS不要将布尔值与真值进行比较,只需使用它们。也要使用
而不是
==false
。所以notUnderAttack只是
返回rowCheck(row)&&colCheck(col)&&diagonalCheck(row,col)
。但是“检查”并不能传达任何信息。当布尔值为真时,命名布尔值。此外,在名字中加上“not”会使事情复杂化。“!”在真实案例前面,甚至可以保存2个字符。(开玩笑。但不是开玩笑。)所以欠击就是返回行欠击(行)| |列欠击(列)| | |对角线欠击(行,列)
public boolean notUnderAttack(int row, int col) {    
    if ((rowCheck(row) == false) || (colCheck(col) == false) || (diagonalCheck(row, col) == false)) {
        return false; 
    }
    return true; 
}