我目前正在尝试学习Java中的回溯主题。这真的让我感到困惑,因为我被困住了。
问题是找到将N个皇后区放置在NxN国际象棋棋盘中的方法,以使任何一个皇后区都不能互相攻击。女王可以在同一行,同一列和对角线进攻。我的代码是这样的:

import java.util.Scanner;

class Main {
    public static void putZero(int[][] board,int n){
         for(int i = 0;i<n;i++){
            for(int j=0;j<n;j++){
                board[i][j]=0;
            }
        }
    }
    public static void printBoard(int[][] board,int n){
        for(int i = 0;i<n;i++){
            for(int j=0;j<n;j++){
                System.out.print(board[i][j]);
            }
            System.out.print("\n");
        }
         System.out.print("\n\n\n");
    }
    public static void SolveNQ(int n){
        int[][] board = new int[n][n];
        putZero(board,n);
        if(SolveQUtil(board,0,n)==true){
            printBoard(board,n);
        }
    }
    public static boolean isSafe(int row, int col, int[][] board,int n){
        int i,j;
        for(i=0;i<col;i++){
           if(board[row][i]==1)
            return false;
        }
        for(i=row,j = col; i >= 0 && j >= 0; i--, j--){
        if(board[i][j]==1)
        return false;
        }
         for (i = row, j = col; j >= 0 && i < n; i++, j--)
            if (board[i][j] == 1)
                return false;

        return true;
    }
    public static boolean SolveQUtil(int[][] board, int col, int n){
        if(col>=n){
            return true;
        }
        else
        for(int i=0;i<n;i++){
        if(isSafe(i,col,board,n)==true){
                board[i][col]=1;
        boolean a = SolveQUtil(board,col+1,n);
        if(a==true)
                return true;
        else
            board[i][col]=0;
        }
    }
        return false;

    }
     public static void main(String[] args){
        Scanner scan = new Scanner(`enter code here`System.in);
        int n = scan.nextInt();;
        SolveNQ(n);
     }
}


它正在产生我想要的结果,但是我不了解这是如何工作的。在我的方法SolveQUtil()中,该方法再次被调用,这是“递归的”。调用col = 0时,由于不存在皇后,所以Q1放置在[0,0]处。但是当col = 1递归调用时,它将搜索合适的位置并返回'true'。现在,难道不是每次返回true时SolveNQ()都要打印解决方案吗?什么时候返回假?这如何运作?我是初学者,有人可以一步一步向我解释一下吗?先感谢您。

最佳答案

进行打印的SolveNQ不会递归调用; SolveQUtilSolveNQ调用的,并且不打印任何内容,是递归的。

关于java - 解决N个皇后区的回溯问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60822253/

10-08 20:35