使用递归求解N Queens

时间:2016-08-31 09:12:46

标签: java recursion

下面是我的代码,我不知道我哪里出错了 它汇编得很好,但是没有打印出正确的结果;;; 如果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);
    }
}

1 个答案:

答案 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++){

通过此修改,程序按预期工作。