leetcode 51 52:N皇后问题位运算

leetcode题解之52. N皇后 II n 皇后问题研究的是如何将 leetcode题解之52. N皇后 II n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。 上图为 8 皇后问题的一种解法。 给定一个整数 n,返回 n 皇后不同的解决方案的数量。 示例: 输入: 4 输出: 2 解释: 4 皇后问题存在如下两个不同的解法。 [ [".Q…", // 解法 1 “…Q”, “Q…”, “…Q.”], ["…Q.", // 解法 2 “Q…”, “…Q”, “.Q…”] ] 提示: 皇后,是国际象棋中的棋子,意味着国王的妻 阅读详情

题目描述:
51和52题是在给出N的时候,分别求出解的个数以及打印出各个解。
可以利用位运算解决N皇后问题。
主要思路:
与深度优先搜索+回溯的方式一致,只是在进行判断是否合理等一些细节上,选择利用位运算的方式进行处理。
利用位运算记录皇后的信息,就可以将记录皇后信息的空间复杂度从 O(N) 降到 O(1)。
具体做法是,使用三个整数 columns、diagonals_1和diagonals_2
​分别记录每一列以及两个方向的每条斜线上是否有皇后,每个整数有 N 个二进制位。棋盘的每一列对应每个整数的二进制表示中的一个数位,其中棋盘的最左列对应每个整数的最低二进制位,最右列对应每个整数的最高二进制位。
用 00 代表可以放置皇后的位置,11 代表不能放置皇后的位置。
三个整数的计算方法及具体的流程详见代码,一定要记住这个流程

class Solution:
    def totalNQueens(self, n: int) -> int:
        if n < 1:
            return []
        self.count = 0
        self.dfs(0, 0, 0, 0, n)
        return self.count

    def dfs(self, row, col, pie, na, n):
        if row >= n:
            self.count += 1
            return
        bits = ~(col | pie | na) & ((1 << n)-1)  # 本来是0可以为放置的位置,现在改为1,因为不然的话取非之后,前面全是1(这样做的的主要目的是只要后n位中可以放置的部分,不然的话前面全是0无法判断是否是可以放皇后的位置)
        while bits > 0:
            p = bits & -bits
            self.dfs(row+1, col | p, (pie | p) << 1, (na | p) >> 1, n)
            bits = bits & (bits - 1)

对于51题中,要把N皇后的每一个解都打印出来的问题,只需要申请一个数组,利用这个数组保存每一行放置的位置,之后按照每行放置的位置按照要求打印出来即可,代码如下:

class Solution:
    def solveNQueens(self, n: int) -> List[List[str]]:
        def generateBoard():   # 这里是对解按照格式进行打印的方式,很简洁可以学习一下
            board = list()
            for i in range(n):
                row[queens[i]] = "Q"
                board.append("".join(row))
                row[queens[i]] = "."
            return board

        def solve(row: int, columns: int, diagonals1: int, diagonals2: int):
            if row == n:
                board = generateBoard()
                solutions.append(board)
            else:
                availablePositions = ((1 << n) - 1) & (~(columns | diagonals1 | diagonals2))
                while availablePositions:
                    position = availablePositions & (-availablePositions)
                    availablePositions = availablePositions & (availablePositions - 1)
                    column = bin(position - 1).count("1")
                    queens[row] = column  # 注意这里获得二进制对应位置的代码
                    solve(row + 1, columns | position, (diagonals1 | position) << 1, (diagonals2 | position) >> 1)

        solutions = list()
        queens = [-1] * n
        row = ["."] * n
        solve(0, 0, 0, 0)
        return solutions

复杂度分析
时间复杂度:O(N!),其中 N 是皇后数量。
空间复杂度:O(N),其中 N 是皇后数量。由于使用位运算表示,因此存储皇后信息的空间复杂度是 O(1),空间复杂度主要取决于递归调用层数,递归调用层数不会超过 N。

SAP 财务接口开发:完全清账 vs 标准过账的 CO-PA(获利能力字段) 赋值全解析(含设计哲学) 用于完全清账场景:用于标准凭证过账/部分清账两者对 CO-PA 数据的传递方式截然不同。本文不仅提供完整的代码实现,更深入解析为什么 SAP 要这样设计——了解设计哲学,才能灵活应对各类需求。完全清账→ 调用,必须在T_FTPOST中传递,其他特征用BSEG-RKE_前缀。标准过账/部分清账→ 调用,在CRITERIA表中传递特征,字段名直接用WERKSARTNR等。SAP 的设计智慧面向不同场景,采用不同机制,各司其职。通过接口抽象,将复杂的 CO-PA 配置逻辑封装在内部,对外提供简洁的调用方式。 阅读详情

相关推荐

MacBook上玩转国民技术N32G430:从零搭建ARM开发环境(VSCode + pyOCD)

本文详细介绍了在MacBook上搭建国民技术N32G430的ARM开发环境,涵盖VSCode配置、pyOCD调试及一键编译烧录全流程。通过Homebrew安装工具链、配置Python环境及VSCode插件,开发者可在MacOS高效开发嵌入式应用,特别适合国产芯片N32G430的开发者参考。

weixin_30614109的博客 436

深度优先搜索—N皇后 II(leetcode 52)

题目描述 n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。 示例 1: 输入:n = 4 输出:2 解释:如上图所示,4 皇后问题存在两个不同的解法。 示例 2: 输入:n = 1 输出:1 提示: 1 <= n <= 9 皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。 算法分析 这道题和「51. N 皇...

guoxinian的专栏 344

Wan 3.0提示词实战:从抄作业到改作业的完整技巧

AI视频生成中,提示词是决定成片质量的核心。视频模型依赖于文字约束来定义运动轨迹、镜头语言与物理合理性,提示词工程因此成为连接创意与技术的关键。本文从提示词的结构、资源获取、优化方法入手,结合Wan 3.0的模型特点,梳理了从官方模板到社区案例的实战路径,并强调运动一致性、风格词堆砌等常见问题。通过分解主体、动作、镜头等维度,帮助创作者快速找到适配的提示词,提升视频生成的稳定性与惊喜感。

weixin_29483277的博客 351

八皇后时间复杂度_10394 用位运算速解 n 皇后问题

  这是上周 BitTiger 算法讲座「八皇后 + 位运算」的文字整理稿。在讲座中,我讲解了 n 皇后问题的 5 种解法,一种比一种快;从解法三起引入了位运算。讲座的 PPT 和当场使用的 Java 程序已经上传到我的 GitHub:https://github.com/MaigoAkisame/Queens。  当然啦,如果我在这儿写的东西跟讲座里是一模一样的,那就没意思了对吧?所以,本篇专栏...

weixin_39581972的博客 298

FreeRTOS的学习(十四)——PendSV异常

本文将从任务切换的角度出发,学习PendSV异常的相关概念。

LEOD的博客 1730

NSGA-III相关笔记

NSGA-III目录目的区别NSGA-III的算法流程非支配排序详解归一化详解 目录 NSGA-III基于matlab的实现 参考文献 1.An Evolutionary Many-Objective Optimization Algorithm Using Reference-point Based Non-dominated Sorting Approach,Part I: Solving P...

weixin_42555400的博客 1万+

前端玩转位运算(N皇后+Vue3位运算应用)

位运算、Vue3位运算应用shapeFlags、patchFlags、N皇后LeetCode题解。

童欧巴的博客 947

【2026年阿里巴巴集团暑期实习- 4月25日-算法岗-第二题- 矩阵计数】(题目+思路+Java&C++&Python解析+在线测试)

摘要: 给定两个非负整数序列a和b,构造n×m矩阵C,其中C[i][j]=a[i]×b[j]。统计矩阵中元素≥k的数量。解法是先对数组b排序,然后对于每个a[i],若k=0则直接累加m;若a[i]=0且k>0则跳过;否则计算需要的最小b[j]值,在排序后的b中使用二分查找确定满足条件的元素数量。时间复杂度为O((n+m)log m),空间复杂度O(1)。代码实现了排序和二分查找的高效组合。

m0_73659489的博客 65

n皇后位运算算法

回溯法 求出每个格子(x,y)的y-x差值,会发现同一主对角线的差值相同 求出每个格子(x,y)的x+y的和,会发现同一副对角线的和相同 那么我们由ans==ans[j]判断是否同一列,cur-ans[cur]==j-ans[j]判断是否同一主对角线,cur+ans[cur]==j+ans[j]判断是否同一副对角线: int ans[1005]; int n,cnt; void solve(i...

Happig的博客 610

飞书接入OpenClaw:从零到一的保姆级图文教程

本文主要介绍了飞书接入OpenClaw:从零到一的保姆级图文教程,希望能对学习使用OpenClaw 的同学们有所帮助。 文章目录 1. 背景 2. 解决方案 2.1 步骤一:安装插件 2.2 步骤二:创建机器人应用 2.3 步骤三:测试 3. 注意事项

weixin_43178406的博客 13万+

【语音识别】基于MFCC特征实现说话人语音识别matlab源码

1 模型 采用能够反映人对语音的感知特性的Mel频率倒谱系数(MFCC)作为特征参数,以及为避免时间规整问题采用矢量量化技术开发的说话人识别系统.MFCC主要的是模拟人耳的听觉过程,相对于其它参数它对语音波形的变化不敏感,更加稳定,系统取得很好的识别结果,实验表明系统训练和识别的计算量和存储量都比较低. 2 部分代码 functionvarargout=Main(varargin) % MAIN M-file for Main.fig % MAIN, by itself...

qq_59747472的博客 848

利用位运算解决 N 皇后问题

题目: LeetCode 51. N-Queens 分析: N 皇后问题是考查递归回溯的经典问题,深度优先搜索的难点在于如何剪枝,在这个问题里面的剪枝,我们需要利用额外的空间去记录当前行的有效空位,只要一行当中找不到有效空位,递归将不会继续下去。一般的解法是开一个 n*n 的数组,优化一点解法是利用三个数组,分别表示左上,上,右上对当前位置的影响情况,这里有一个点就是一个位置会对其左下,下,右下...

weixin_33830216的博客 285

科研问答:医药类本科生(临床、中医、中药与护理)本科阶段是否需要开展科研学习?

医药类本科生(临床、中医、中药与护理)本科阶段是否需要开展科研学习?

MD Code 1508

N皇后问题解答(LeetCodeP52 & P51)

本文回顾了N皇后问题的解决方案,包括两种LeetCode题目变体:仅统计解法数量(P52)和输出具体棋盘方案(P51)。通过逐行放置皇后并检查冲突(同一列或对角线),使用回溯法递归求解。核心在于验证位置合法性,通过坐标差绝对值判断对角线冲突。文章提供了Java实现代码,并建议先解决P52再处理P51,最后提到可使用位运算优化常数级别性能,但时间复杂度仍为O(n!)。

2301_78330892的博客 737

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Leetcode 51. N 皇后 回溯+剪枝 / 回溯+位运算

本文介绍了N皇后问题的两种回溯解法:朴素回溯和优化剪枝解法。第一种解法通过检查列和两个对角线方向来判断皇后位置是否合法,时间复杂度较高;第二种解法利用两个布尔数组分别记录主对角线和副对角线的占用情况,通过数学公式(i-j+n-1和i+j)快速计算对角线索引,显著提高了效率。两种方法都采用深度优先搜索策略,当找到合法解时记录棋盘状态。文章还提到后续会补充位运算优化的解法,进一步降低空间复杂度。

想买很多漂亮衣服但是买不起的博客 298

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

待深入理解

401. Binary Watch

秋人别院 243

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

皇后之战:揭秘N皇后问题的多维解法与智慧【python 力扣52题】

LeetCode题目52 "N皇后 II"探讨了计算N皇后问题解法数量的五种方法:回溯、位运算优化、迭代回溯、DFS与迭代标记优化。文章详述了每种方法的实现及优劣,提供了算法效率对比。

10年数据\经营分析经验,现任大厂数据分析负责人 1132

基于回溯法解决八皇后问题+以位运算方法优化n皇后问题(算法与数据结构期末设计)

基于回溯法解决n皇后问题+以位运算方法优化n皇后问题。

aoe_z的博客 1373

LeetCode 51. N-Queens和52. N-Queens II的位运算解法

LeetCode 51. N-Queens和52. N-Queens II的位运算解法

u011433274的专栏 1212

【LeetCode】52. N 皇后 II

本文介绍了求解N皇后问题的不同算法,重点是比较了递归回溯、位运算和迭代回溯三种方法。递归回溯是最直观的解法,通过递归尝试所有可能的放置方案;位运算解法利用位掩码优化空间效率;迭代回溯使用栈模拟递归避免栈溢出。三种方法的时间复杂度均为O(n!),但空间复杂度不同:递归和迭代为O(n),位运算为O(1)。文章提供了详细的算法流程图和关键代码实现,特别强调了约束检查、剪枝优化等关键技巧。对于n≤9的问题规模,位运算解法效率最高。

qq_32019341的博客 1209

Leetcode.52. N皇后问题

n-queens-ii The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other. Given an integer n, return the number of distinct solutions to the n-queens puzzle. Example: Input: 4 Output: 2 Explanation:

mirana的专栏 287

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

n 皇后问题 研究的是如何将 n 个皇后放置在 n × n 的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。解释:如上图所示,4 皇后问题存在两个不同的解法。串然后使用位运算加速过程,常数会小一点。当然,可以状态压缩为变为。

Antonio915的博客 484

LeetCode 51~55

前言 本文隶属于专栏《LeetCode 刷题汇总》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构请见LeetCode 刷题汇总 正文 幕布 幕布链接 51. N 皇后 题解 回溯算法(转换成全排列问题 + 剪枝)- 题解后有相关问题 3个set,i,row+i,row-i import scala.collection.mutable.{ListBuffer, Set} object Solution { val col, diagonal1, di

Shockang的博客 6132

LeetCode 52. N皇后 II(N-Queens II)

LeetCode.jpg 52. N皇后 II N皇后 II n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。 image.png 上图为 8 皇后问题的一种解法。 给定一个整数 n,返回 n 皇后不同的解决方案的数量。 示例: 输入: 4 输出: 2 解释: ...

墨1024 526

Leetcode: NO.52 N皇后 II 回溯算法

题目 n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。 上图为 8 皇后问题的一种解法。 给定一个整数 n,返回 n 皇后不同的解决方案的数量。 示例: 输入: 4 输出: 2 解释: 4 皇后问题存在如下两个不同的解法。 [ [".Q..", // 解法 1 "...Q", "Q...", "..Q."], ["..Q.", // 解法 2 "Q...", "...Q", ".Q.."] ] 提示: 皇后,是国际象棋中

泛泛之素 428

【恋上数据结构】回溯、剪枝(八皇后、n皇后)、LeetCode51.N皇后、LeetCode52.N皇后 II

回溯回溯(Back Tracking)提出八皇后问题(Eight Queens)初步思路一:暴力出奇迹初步思路二:根据题意减少暴力程度初步思路三:回溯法(回溯+剪枝)四皇后 - 回溯法图示八皇后 - 回溯法图示n皇后实现合法性检查从某一行开始摆放皇后摆放所有皇后打印n皇后 - 完整实现n皇后优化 - 合法性检查优化合法性检查优化 O(n) -> O(1)完整实现n皇后优化 - 位运算lee...

萌宅鹿的技术小屋 1601
上一篇: leetcode 338: 比特位计数
下一篇: leetcode 70: 爬楼梯
coding_diamond
博客等级 码龄8年 8粉丝 131原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值