LeetCode-八皇后问题

面试题 08.12. 八皇后

设计一种算法,打印 N 皇后在 N × N 棋盘上的各种摆法,其中每个皇后都不同行、不同列,也不在对角线上。这里的“对角线”指的是所有的对角线,不只是平分整个棋盘的那两条对角线。

示例:

 输入:4
 输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
 解释: 4 皇后问题存在如下两个不同的解法。
[
 [".Q..",  // 解法 1
  "...Q",
  "Q...",
  "..Q."],

 ["..Q.",  // 解法 2
  "Q...",
  "...Q",
  ".Q.."]
]

解法1:经典递归回溯法

class Solution {

    public List<List<String>> solveNQueens(int n) {

        int[][] chess=new int[n][n];

        int[][] flag=new int[3][2*n];

        List<List<String>> result=new ArrayList<>();

        this.placeQueen(0,result,chess,flag,n);

        return result;

    }

    private void placeQueen(int row,List<List<String>> result,int[][] chess,int[][] flag,int n){

        int nextRow=row+1;

        if(row>=n){

            // 生成方案

            List<String> solution=new ArrayList<>();

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

                StringBuilder sb=new StringBuilder();

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

                    if(chess[i][j]==0){

                        sb.append(".");

                    }else {

                        sb.append("Q");

                    }

                }

                solution.add(sb.toString());

            }

            result.add(solution);

        }else{

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

                if(flag[0][col]!=1&&flag[1][row+col]!=1&&flag[2][n+row-col]!=1){

                    flag[0][col]=1;

                    flag[1][row+col]=1;

                    flag[2][n+row-col]=1;

                    chess[row][col]=1;

                    row++;

                    placeQueen(nextRow,result,chess,flag,n);

                    row--;

                    chess[row][col]=0;

                    flag[0][col]=0;

                    flag[1][row+col]=0;

                    flag[2][n+row-col]=0;

                }

            }

        }

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值