Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.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 我如何修改这个递归回溯算法(NQueens)来找到所有的解决方案而不是一个?_Java_Algorithm_Recursion_N Queens - Fatal编程技术网

Java 我如何修改这个递归回溯算法(NQueens)来找到所有的解决方案而不是一个?

Java 我如何修改这个递归回溯算法(NQueens)来找到所有的解决方案而不是一个?,java,algorithm,recursion,n-queens,Java,Algorithm,Recursion,N Queens,我已经写了一个方法,它使用递归和回溯来找到N皇后问题的一个解决方案。我现在想做的是修改这个方法,以便它能够找到所有可能的解决方案。我假设我需要使用一个2D整数数组来存储所有的解决方案,并且还需要添加一个计数器,该计数器在每次找到解决方案时递增。但我似乎不知道一旦我找到了一个解决方案,如何让这个方法继续下去,并继续回溯以找到所有其他可能的解决方案。我想我要做的是去掉“return true”;当找到一个解决方案时会出现这种情况,但是我不知道如何让方法递归地确定是否找到了一个解决方案。。。。以下是我

我已经写了一个方法,它使用递归和回溯来找到N皇后问题的一个解决方案。我现在想做的是修改这个方法,以便它能够找到所有可能的解决方案。我假设我需要使用一个2D整数数组来存储所有的解决方案,并且还需要添加一个计数器,该计数器在每次找到解决方案时递增。但我似乎不知道一旦我找到了一个解决方案,如何让这个方法继续下去,并继续回溯以找到所有其他可能的解决方案。我想我要做的是去掉“return true”;当找到一个解决方案时会出现这种情况,但是我不知道如何让方法递归地确定是否找到了一个解决方案。。。。以下是我目前拥有的一个解决方案版本:

public boolean placeQueens(int x, int y) {
    if (!underAttack(x, y)) {
        queen[x] = y;
        board[x][y] = true;
        if (x + 1 == boardSize
                ||placeQueens(x + 1, 0)) {
            return true;
        }
        queen[x] = 0;
        board[x][y] = false;
    }
    if (y + 1 == boardSize) {
        return false;
    }
    return placeQueens(x, y + 1);
}
编辑:修复了方法,结果如下。它可能还是有点凌乱,但它起作用了!我没有打印找到的每个解决方案,而是将其添加到数组中。我仍然使用queen[]变量的原因是,我可以使解决方案数组独立于board状态。我仍然使用board[][]变量的原因是它使underAttack()方法更容易编写(特别是在计算坡度时)。。。。无论如何,我真的很感谢大家的帮助

public void placeQueen(int x) {
    if (x == N) {            
        for (int i : queen) {
            solution[counter][i] = queen[i];
        }
        counter++;            
        return;
    }
    for (int y = 0; y < N; y++) {
        if (!underAttack(x, y)) {                
            queen[x] = y;
            board[x][y] = true;
            placeQueen(x + 1);
            queen[x] = 0;
            board[x][y] = false;
        }
    }
}
public void placeQueen(int x){
如果(x==N){
(国际一级:女王){
溶液[计数器][i]=皇后[i];
}
计数器++;
返回;
}
对于(int y=0;y
目前,您正在寻找一种解决方案。当你找到一个可以放置皇后的x,y时,你可以向前移动一列并尝试将皇后放置在下一列中

要生成所有解,而不是返回true,可以在末尾打印最终数组,回溯并更改当前列的位置,然后再次尝试生成解

伪代码可以是这样的

Place(x)

  // Here x is the column number where you want to put the queen
  if (x == board_size + 1):
      print (array A)
      return;
  for y from 0 to board_size:
       if (!underattack(A,x,y)) // A[x] = y => the queen is at row y in col x
            A[x] = y
            Place(x+1)
  return;

在这里,即使我们发现一个特定的(x,y)有效,我们也会回溯并尝试当前x的后续y值。

目前,您只是在寻找一个解决方案。当你找到一个可以放置皇后的x,y时,你可以向前移动一列并尝试将皇后放置在下一列中

要生成所有解,而不是返回true,可以在末尾打印最终数组,回溯并更改当前列的位置,然后再次尝试生成解

伪代码可以是这样的

Place(x)

  // Here x is the column number where you want to put the queen
  if (x == board_size + 1):
      print (array A)
      return;
  for y from 0 to board_size:
       if (!underattack(A,x,y)) // A[x] = y => the queen is at row y in col x
            A[x] = y
            Place(x+1)
  return;

在这里,即使我们发现一个特定的(x,y)有效,我们也会回溯并尝试当前x的后续y值。

这里是nqueen的伪代码:-

void Nqueens(int row,int columns[],int n) {

if(row<n) {

for(int col=0;col<n;col++) {

  if(safe(row,col,columns)) {

     columns[i] = k;
     NQueens(row+1,columns);
  }

}



}

else {

   printf("solution: \n");

   for(int i =0;i<n;i++) {

       printf("(%d,%d)\n",i,columns[i]);
   }

}

}
void nqueen(int行,int列[],int n){

如果(行这里是nqueen的伪代码:-

void Nqueens(int row,int columns[],int n) {

if(row<n) {

for(int col=0;col<n;col++) {

  if(safe(row,col,columns)) {

     columns[i] = k;
     NQueens(row+1,columns);
  }

}



}

else {

   printf("solution: \n");

   for(int i =0;i<n;i++) {

       printf("(%d,%d)\n",i,columns[i]);
   }

}

}
void nqueen(int行,int列[],int n){

if(row)谢谢。这确实帮助我以不同的方式思考问题。出于某种原因(可能是因为我让方法返回布尔值),我一直认为该方法需要知道递归是否找到了解决方案。相反,每个实例只需要知道其参数是否是解决方案,或者如果不是,是终止还是递归(语法?)。如果没有你的帮助,我想我不会明白这一点,所以再次感谢。我觉得我现在对递归的理解稍微好了一点。我在OP中发布了修改后的方法。谢谢。这确实帮助我以不同的方式思考问题。出于某种原因(可能是因为我让该方法返回布尔值),我一直认为该方法需要知道递归是否找到了解决方案。相反,每个实例只需要知道其参数是否是解决方案,或者如果不是,是终止还是递归(语法?)。如果没有你的帮助,我想我不会明白这一点,所以再次感谢。我觉得我现在对递归的理解稍微好一点了。我在OP中发布了修改后的方法。