LeetCode51-20.9.3-N皇后

链接LeetCode51
过程:略
思路:枚举回溯
代码

class Solution {
    List<List<String>> ans=new ArrayList<>();
    List<String> temp=new ArrayList<>();
    boolean[][] fail=null;
    int n;
    public List<List<String>> solveNQueens(int n) {
        fail=new boolean[n][n];
        this.n=n;
        dfs(0);
        return ans;
    }
    public void dfs(int k){
        if(k==n){
            ans.add(new ArrayList<>(temp));
            return;
        }
        StringBuilder sb=new StringBuilder();
        boolean[][] fail2=new boolean[n][n];
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                fail2[i][j]=fail[i][j];
            }   
        }
        for(int i=0;i<n;i++){
            if(!fail[k][i]){
                sb.append('Q');
                for(int j=i+1;j<n;j++)sb.append('.');
                temp.add(sb.toString());
                for(int row=k+1;row<n;row++)fail[row][i]=true;
                for(int row=k+1,col=i+1;row<n&&col<n;row++,col++)fail[row][col]=true;
                for(int row=k+1,col=i-1;row<n&&col>=0;row++,col--)fail[row][col]=true;
                dfs(k+1);
                for(int row=0;row<n;row++){
                    for(int col=0;col<n;col++){
                        fail[row][col]=fail2[row][col];
                    }
                }
                sb.delete(i,n);
                temp.remove(k);
            }
            sb.append('.');
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值