【算法三十七】51. N 皇后

51. N 皇后

回溯:

java 复制代码
class Solution {
    public List<List<String>> solveNQueens(int n) {
        List<List<String>> ans = new ArrayList<>();
        //每一行的queen在哪一列
        int[] queens = new int[n];
        //每一列有没有重复
        boolean[] col = new boolean[n];
        //主对角线有没有重复
        boolean[] dig1 = new boolean[2*n-1];
        //副对角线有没有重复
        boolean[] dig2 = new boolean[2*n-1];

        dfs(0,queens,col,dig1,dig2,ans);
        return ans;
    }

    private void dfs(int r,int[] queens,boolean[] col,boolean[] dig1,boolean[] dig2,List<List<String>> ans){
        int n = col.length;
        if(r == n){
            List<String> partAns = new ArrayList<>();
            for(int i:queens){
                char[] partAns1 = new char[n];
                Arrays.fill(partAns1,'.');
                partAns1[i] = 'Q';
                partAns.add(new String(partAns1));
            }
            ans.add(partAns);
            return;
        }
        //对列遍历
        for(int c = 0;c<n;c++){
            //对副对角线的规律加上n-1这样符合下标规律
            int rc = r-c + n-1;
            if(!col[c] && !dig1[r+c] && !dig2[rc]){
                queens[r] = c;
                col[c] = dig1[r+c] = dig2[rc] = true;
                //递归
                dfs(r+1,queens,col,dig1,dig2,ans);
                //恢复现场
                col[c] = dig1[r+c] = dig2[rc] = false;
            }
        }
    }
}

时间复杂度:O(N^2 * N!)

空间复杂度:O(N)

相关推荐
倒头就睡的小比特1 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!1 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼1 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光1 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark1 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her11 天前
并查集-听课笔记
笔记·算法·并查集
码流子1 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven1 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark1 天前
从算法设计模式看编程思维的抽象能力4
算法
2601_962218611 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法