下面是我的代码,我不知道我哪里出错了 它汇编得很好,但是没有打印出正确的结果;;; 如果N是4,结果应该是 2 4 1 3 然而,它打印 1 3 0 0
我猜for循环有问题,因为当我用另一个像5这样的值时,它也只打印了两个数字 这是N = 5的结果; 1 4 0 0 0
import java.util.Scanner;
public class NQueens{
public static int N ;
public static int [] cols;
public static void printcols(){
for(int i =1; i<=N; i++){
System.out.print(cols[i] + " ");
}
System.out.print("\n");
}
public static boolean promising(int level){
for(int i =1; i<level ; i++){
if(cols[i] == cols[level]){
return false;
}else if(level-i == Math.abs(cols[level]- cols[i]))
return false;
}
return true;
}
public static boolean queens(int level){
if(!promising(level)){
printcols();
return false;
}
else if(level == N){
printcols();
return true;
}
for(int i =1; i<N; i++){
cols[level+1] = i;
if(queens(level+1)){
return true;
}
}
return false;
}
public static void main(String []args){
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
cols = new int [N+1];
queens(0);
}
}
答案 0 :(得分:3)
它不只是打印1 3 0 0
,而是打印每个回溯步骤,最后它找不到任何解决方案。问题是您正在混合基于0和基于索引的索引,并最终出错。
在以下行中:
for(int i =1; i<N; i++){
您正在迭代N-1
种可能性,只留下i == N
。所以修复只是为了允许平等:
for(int i =1; i<=N; i++){
通过此修改,程序按预期工作。