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

相关推荐
样例过了就是过了2 小时前
LeetCode热题100 爬楼梯
c++·算法·leetcode·动态规划
DoUfp0bgq2 小时前
从直觉到算法:贝叶斯思维的技术底层与工程实现
算法
ThisIsMirror2 小时前
leetcode 452 Arrays.sort()排序整数溢出、Integer.compare(a[1], b[1])成功的问题
算法·leetcode
王老师青少年编程2 小时前
csp信奥赛c++之状压枚举
数据结构·c++·算法·csp·信奥赛·csp-s·状压枚举
wayz112 小时前
数据分析中的异常值处理:MAD
算法·数据挖掘·数据分析
飞Link2 小时前
LangGraph 核心架构解析:节点 (Nodes) 与边 (Edges) 的工作机制及实战指南
java·开发语言·python·算法·架构
Mr_Xuhhh3 小时前
深入理解二叉树:从数据结构到算法实战
数据结构·算法
xuhaoyu_cpp_java3 小时前
Boyer-Moore 投票算法
java·经验分享·笔记·学习·算法
kobesdu3 小时前
FAST-LIO2 + 蓝海M300激光雷达:从建图到实时栅格图的完整流程
算法·机器人·ros·slam·fast lio