【算法三十七】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)

相关推荐
小O的算法实验室11 小时前
2025年SEVC,面向进化计算的学习注入式优化,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
啊我不会诶11 小时前
2024北京市赛补题
c++·算法
shehuiyuelaiyuehao11 小时前
算法13,滑动窗口,水果成篮
算法·哈希算法·散列表
智慧物业老杨11 小时前
物业数智化转型实战:从单一服务到综合解决方案的技术落地路径
人工智能·算法·ai
夏末蝉未鸣0111 小时前
Sort-Merge Join【排序连接算法】详解(python代码实现,以FULL JOIN为例)
数据结构·算法
tjl521314_2111 小时前
01C++ 分离编译与多文件编程
前端·c++·算法
_日拱一卒11 小时前
LeetCode:23合并K个升序链表
java·数据结构·算法·leetcode·链表·职场和发展
哆啦刘小洋11 小时前
【LeetCode每日一题】:2033(贪心+快速排序魔改)
算法·leetcode
WolfGang00732111 小时前
代码随想录算法训练营 Day48 | 图论 part06
算法·图论
cheems952711 小时前
[算法手记] 动态规划 ,二维费用限制背包问题如何处理
算法·动态规划