当前位置: 首页 > article >正文

【Leetcode 每日一题】52. N 皇后 II

问题背景

n n n 皇后问题 研究的是如何将 n n n 个皇后放置在 n × n n \times n n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n n n,返回 n n n 皇后问题 不同的解决方案的数量。

数据约束

  • 1 ≤ n ≤ 9 1 \le n \le 9 1n9

解题过程

只需要统计可能的结果数量,参考修改 昨天的题解 就可以。
在不需要输出路径的前提下,位运算实现的优势就非常明显了。直接标记需要路径数组来记录之前访问过的节点信息,用布尔型数组虽然不需要记录路径,也避免不了定义几个标记数组。

具体实现

直接判断

class Solution {
    public int totalNQueens(int n) {
        int[] path = new int[n];
        return dfs(0, n, path);
    }

    private int dfs(int i, int n, int[] path) {
        if(i == n) {
            return 1;
        }
        int res = 0;
        for(int j = 0; j < n; j++) {
            if(check(i, j, path)) {
                path[i] = j;
                res += dfs(i + 1, n, path);
                path[i] = 0;
            }
        }
        return res;
    }

    private boolean check(int i, int j, int[] path) {
        for(int k = 0; k < i; k++) {
            if(j == path[k] || Math.abs(i - k) == Math.abs(j - path[k])) {
                return false;
            }
        }
        return true;
    }
}

位运算限制

class Solution {
    public int totalNQueens(int n) {
        return dfs(n, (1 << n) - 1, 0, 0, 0);
    }

    private int dfs(int n, int mask, int col, int mainDiag, int subDiag) {
        if(col == mask) {
            return 1;
        }
        int limit = col | mainDiag | subDiag;
        int candidate = mask & (~limit);
        int cur;
        int res = 0;
        while(candidate != 0) {
            cur = candidate & (-candidate);
            candidate ^= cur;
            res += dfs(n, mask, col | cur, (mainDiag | cur) << 1, (subDiag | cur) >>> 1);
        }
        return res;
    }
}

数组标记

class Solution {
    public int totalNQueens(int n) {
        boolean[] col = new boolean[n];
        boolean[] mainDiag = new boolean[2 * n - 1];
        boolean[] subDiag = new boolean[2 * n - 1];
        return dfs(0, n, col, mainDiag, subDiag);
    }

    private int dfs(int i, int n, boolean[] col, boolean[] mainDiag, boolean[] subDiag) {
        if(i == n) {
            return 1;
        }
        int res = 0;
        for(int j = 0; j < n; j++) {
            if(!col[j] && !mainDiag[i + j] && !subDiag[i - j + n - 1]) {
                col[j] = mainDiag[i + j] = subDiag[i - j + n - 1] = true;
                res += dfs(i + 1, n, col, mainDiag, subDiag);
                col[j] = mainDiag[i + j] = subDiag[i - j + n - 1] = false;
            }
        }
        return res;
    }
}

http://www.kler.cn/a/420025.html

相关文章:

  • Git中HEAD、工作树和索引的区别
  • 消息中间件-Kafka1-实现原理
  • 华为HarmonyOS 让应用快速拥有账号能力 -- 1 华为账号一键登录
  • 【力扣】3274. 检查棋盘方格颜色是否相同
  • python中权重剪枝,低秩分解,量化技术 代码
  • 【Docker】Docker配置远程访问
  • windows执行多个jar包脚本,若依微服务批量执行脚本
  • 安装 RabbitMQ 服务
  • Github中PAT和SSHKeys区别
  • vue和react之间的区别?
  • 工业机器视觉-基于深度学习的托盘PCB识别
  • 【职业发展】从ETL到大数据:如何规划你的数据职业生涯?
  • Node.js HTTP模块详解:创建服务器、响应请求与客户端请求
  • AIoT赋能下的智慧园区管理系统,构建新一代智能园区
  • IDEA 2024 配置Maven
  • 【CSS in Depth 2 精译_064】10.3 CSS 中的容器查询相对单位 + 10.4 CSS 容器样式查询 + 10.5 本章小结
  • 数据处理与统计分析——07-Pandas的concat连接、merge()合并、多表查询、内/外/自连接查询操作
  • 【温州】《政务信息化项目软件开发费用测算规范》(DB 3303/T 059—2023)-省市费用标准解读系列23
  • 机器学习周志华学习笔记-第11章<特征选择与稀疏学习>
  • 计算机的错误计算(一百七十二)
  • 3dtile平移子模型以及修改 3D Tiles 模型的模型矩阵z平移
  • 用原生JS创建简易的axios
  • Django 视图层
  • openjdk17 jvm 对象 内存溢出 在C++源码体现
  • 数据仓库: 8- 数据仓库性能优化
  • 视频video鼠标移入移除展示隐藏(自定义控件)