Java 8皇后算法:未获得完整结果集

Java 8皇后算法:未获得完整结果集,java,algorithm,recursion,n-queens,Java,Algorithm,Recursion,N Queens,下面是我试图打印8个皇后问题的所有解决方案(将8个皇后放在棋盘上,这样它们就不会互相攻击)。但是,此解决方案仅打印4个答案,而92个答案应该存在。有人知道怎么了吗 static int[][] visited = new int[8][8]; static int[][] board = new int[8][8]; static int numQueens = 0; public static void main(String[] args) { //call recursiv

下面是我试图打印8个皇后问题的所有解决方案(将8个皇后放在棋盘上,这样它们就不会互相攻击)。但是,此解决方案仅打印4个答案,而92个答案应该存在。有人知道怎么了吗

static int[][] visited = new int[8][8];
static int[][] board = new int[8][8];
static int numQueens = 0;
public static void main(String[] args) {
        //call recursive method from every starting position            
        for(int i=0; i<8; i++){
            for(int j=0; j<8; j++){
                putQueens(board, i, j);
                //clear board and visited array, as well as numQueens
                for(int i2=0; i2<8; i2++){
                    for(int j2=0; j2<8; j2++){
                        board[i2][j2]=0;
                        visited[i2][j2]=0;
                    }
                }
                numQueens=0;
            }
        }
}

static void putQueens(int[][]board, int row, int col){

        if(visited[row][col]==1)
            return;
        visited[row][col]=1;
        boolean hasQueen = false;
            //check columns
        for(int j=0; j<board[0].length; j++){
            if(board[row][j]==1)
                hasQueen = true;
        }
            //check rows
        for(int i=0; i<board.length; i++){
            if(board[i][col]==1)
                hasQueen = true;

        }
            //check diagonals
        for(int i=row; i<board.length; i++){
            if(col+(i-row)<=7){

                if(board[i][col+(i-row)]==1)
                    hasQueen=true;
            }

        }    
            //check diagonals

        for(int i=row; i>=0; i--){
            if(col-(row-i)>=0){
                if(board[i][col-(row-i)]==1)
                    hasQueen=true;
            }
        }                    
            //check diagonals
        for(int i=row; i<board.length; i++){
            if(col-(i-row)>=0){    
                if(board[i][col-(i-row)]==1)
                    hasQueen=true;
            }

        }
            //check diagonals

        for(int i=row; i>=0; i--){
            if(col+(row-i)<=7){
                if(board[i][col+(row-i)]==1)
                    hasQueen=true;
            }
        }
            //print if solution
        if(!hasQueen){
            board[row][col] = 1;
            numQueens++;

            if(numQueens==8){
                System.out.println("==========");
                for(int i=0; i<8; i++){
                    for(int j=0; j<8; j++){
                        System.out.print(String.format("%3s", board[i][j]));
                        board[i][j]=0;
                    }
                    System.out.println("");

                }
                numQueens=0;


            }

        }

        //recurse
        if(row!=7)
            putQueens(board, row+1, col);
        if(col!=7)  
            putQueens(board, row, col+1);
        if(row!=0)
            putQueens(board, row-1, col);
        if(col!=0)
            putQueens(board, row, col-1);


    }
static int[][]已访问=新int[8][8];
静态int[][]板=新int[8][8];
静态int numQueens=0;
公共静态void main(字符串[]args){
//从每个起始位置调用递归方法

对于(iTi=0;i因为你的算法是错误的,你永远都得不到所有的组合。这里是你想要做的。从每一个板单元开始,你可以在BFS时尚中探索相邻的细胞,并且尽可能地把皇后放在后面。在你的棋盘完成之后,你打印出来,然后把它擦掉。注意你的方法不考虑每一个可能性。e选项,对于每个单元格,您最多可以使用一个解决方案(总共最多64个)。只需做一个简单的回溯方法。's sample implementation。

你永远不会得到所有的组合,因为你的算法是错误的。这是你想要做的。从每个板单元开始,你开始以BFS方式探索相邻的单元,并尽可能地放置queen。板完成后,你将其打印出来,并在战后将其清除注意,你的方法不考虑每一个可能的选项,对于每一个单元,你最多只能得到1个解(总共64个)。。只需执行一个简单的回溯方法。's示例实现。

变量
numQueens
board
访问的
尚未声明。您能否将它们与代表性分配一起添加到代码中?您的递归算法不包括任何回溯。这意味着您不尝试其他位置或者第二、第三、第四等皇后区。变量
numQueens
board
访问的
尚未声明。您可以将它们与代表性分配一起添加到您的代码中吗?您的递归算法不包括任何回溯。这意味着您不会尝试第二、第三、第四等皇后区的其他位置。