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

news2024/10/7 14:32:20

作者介绍:10年大厂数据\经营分析经验,现任大厂数据部门负责人。
会一些的技术:数据分析、算法、SQL、大数据相关、python
欢迎加入社区:码上找工作
作者专栏每日更新:
LeetCode解锁1000题: 打怪升级之旅
python数据分析可视化:企业实战案例
备注说明:方便大家阅读,统一使用python,带必要注释,公众号 数据分析螺丝钉 一起打怪升级

题目描述

给定一个整数 n,返回 n×n 棋盘上的 N 皇后问题的不同解决方案的数量。

每一种解法包含一个明确的 n×n 棋盘上的皇后放置方式,其中 'Q' 代表一个皇后,而 '.' 代表空位。每个皇后都必须满足不能与其他皇后在同一行、同一列或同一对角线上。

输入格式
  • n:一个整数,表示棋盘的大小。
输出格式
  • 返回所有独特的 n 皇后问题的解决方案数量。

示例

示例 1

在这里插入图片描述

输入: n = 4
输出: 2
示例 2
输入: n = 1
输出: 1

注意
LeetCode题目51 "N皇后"与题目52 "N皇后II"虽然都是基于经典的N皇后问题,但两者的主要区别在于输出的需求不同:

N皇后 (题目 51)

  • 目标:找出所有可能的N皇后解决方案的具体棋盘布局。
  • 输出:返回所有解决方案,每个解决方案都详细展示了皇后的具体摆放位置。每个解决方案是一个包含n个字符串的列表,每个字符串长度为n,表示棋盘的一行,其中’Q’表示皇后,'.'表示空位。
  • 解法关注点:除了求解算法的有效性外,还需要关注如何构造并展示完整的棋盘布局。

N皇后 II (题目 52)

  • 目标:仅计算N皇后问题的不同解决方案数量。
  • 输出:返回解决方案的数量,而不是具体的棋盘布局。
  • 解法关注点:主要关注于优化算法的效率以快速计算出解决方案的总数,而不需要构造棋盘的具体布局。
    解法对比
    尽管两个问题在解法上可能使用类似的技术(如回溯法),51题需要更多的空间和逻辑来存储和展示所有可能的棋盘配置,而52题则更注重于计数优化,可能会使用更加精简的数据结构(如位运算)来加速计数过程。

方法一:回溯算法

解题步骤
  1. 初始化变量:创建一个用于存储当前行皇后位置的列表。
  2. 定义回溯函数:递归定义函数以尝试每一行的每个位置。
  3. 合法性检查:检查当前位置放置皇后是否合法,即检查列和两个方向的对角线。
  4. 递归与计数:递归地放置下一个皇后,如果完成一种有效布局则增加计数。
完整的规范代码
def totalNQueens(n):
    """
    计算 n 皇后问题的解决方案总数
    :param n: int, 棋盘大小
    :return: int, 解决方案总数
    """
    def backtrack(row, diagonals, anti_diagonals, cols):
        if row == n:
            nonlocal count
            count += 1
            return
        
        for col in range(n):
            curr_diagonal = row - col
            curr_anti_diagonal = row + col
            
            if (col in cols or curr_diagonal in diagonals or curr_anti_diagonal in anti_diagonals):
                continue
            
            cols.add(col)
            diagonals.add(curr_diagonal)
            anti_diagonals.add(curr_anti_diagonal)
            
            backtrack(row + 1, diagonals, anti_diagonals, cols)
            
            cols.remove(col)
            diagonals.remove(curr_diagonal)
            anti_diagonals.remove(curr_anti_diagonal)

    count = 0
    backtrack(0, set(), set(), set())
    return count

# 示例调用
print(totalNQueens(4))  # 输出: 2
算法分析
  • 时间复杂度:(O(n!)),尽管有剪枝,每层递归的选择数接近 n
  • 空间复杂度:(O(n)),递归栈深度加用于存储状态的空间。

方法二:位运算优化的回溯算法

解题步骤
  1. 位运算优化:使用位运算代替集合操作,提高效率。
  2. 定义位运算回溯函数:使用位掩码表示列和对角线的占用状态,通过位运算快速检查和修改状态。
  3. 递归与计数:递归放置皇后,完成布局时增加解决方案计数。
完整的规范代码
def totalNQueens(n):
    """
    计算 n 皇后问题的解决方案总数,使用位运算进行优化
    :param n: int, 棋盘大小
    :return: int, 解决方案总数
    """
    def solve(row, hills, next_row, dales):
        if row == n:
            nonlocal count
            count += 1
            return
        
        free_columns = columns & ~(hills | next_row | dales)
        while free_columns:
            curr_column = -free_columns & free_columns
            solve(row + 

1, (hills | curr_column) << 1, next_row | curr_column, (dales | curr_column) >> 1)
            free_columns &= free_columns - 1

    columns = (1 << n) - 1
    count = 0
    solve(0, 0, 0, 0)
    return count

# 示例调用
print(totalNQueens(4))  # 输出: 2
算法分析
  • 时间复杂度:(O(n!)),位运算显著提高了效率,但最坏情况下仍需尝试所有可能。
  • 空间复杂度:(O(n)),递归深度决定了空间复杂度,虽然使用位运算减少了空间占用。

方法三:迭代回溯

解题步骤
  1. 使用栈模拟递归:使用栈来模拟递归过程,避免函数调用的开销。
  2. 迭代处理:在迭代中管理棋盘状态和递归变量,以模拟递归调用栈的行为。
完整的规范代码
def totalNQueens(n):
    """
    使用迭代回溯解决 n 皇后问题
    :param n: int, 棋盘大小
    :return: int, 解决方案总数
    """
    stack = [(0, 0, 0, 0)]  # (row, hills, next_row, dales)
    count = 0
    while stack:
        row, hills, next_row, dales = stack.pop()
        if row == n:
            count += 1
            continue
        
        free_columns = ((1 << n) - 1) & ~(hills | next_row | dales)
        while free_columns:
            curr_column = -free_columns & free_columns
            stack.append((row + 1, (hills | curr_column) << 1, next_row | curr_column, (dales | curr_column) >> 1))
            free_columns &= free_columns - 1
    return count

# 示例调用
print(totalNQueens(4))  # 输出: 2
算法分析
  • 时间复杂度:(O(n!)),迭代的方式减少了递归调用开销,但仍然需要尝试所有可能的放置方式。
  • 空间复杂度:(O(n)),虽然使用栈来模拟递归,但空间复杂度与递归方法相当。

不同算法的优劣势对比

特征方法一: 回溯算法方法二: 位运算优化回溯方法三: 迭代回溯
时间复杂度(O(n!))(O(n!))(O(n!))
空间复杂度(O(n))(O(n))(O(n))
优势- 易于理解和实现- 空间效率高- 避免递归调用开销
劣势- 空间消耗较大- 理解和实现较为复杂- 状态维护较为复杂

应用示例

科学研究
N皇后问题常用于算法研究和教学,特别是在探讨组合数学、算法优化、复杂度分析等领域。此问题的不同解决策略可用于教授递归、回溯及其优化。

算法竞赛
在算法竞赛中,N皇后问题是经典问题,经常出现在各类比

赛和面试中,作为测试程序员解决复杂问题能力的一种方式。

通过以上方法和示例,可以深入理解和掌握N皇后问题的多种解决方案及其应用场景。这些技术不仅限于此问题,还可广泛应用于其他需要递归和回溯解决的问题中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1610870.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(2022级)成都工业学院数据库原理及应用实验六: SQL DML(增、删、改)

写在前面 1、基于2022级软件工程/计算机科学与技术实验指导书 2、成品仅提供参考 3、如果成品不满足你的要求&#xff0c;请寻求其他的途径 运行环境 window11家庭版 Navicat Premium 16 Mysql 8.0.36 实验要求 在实验三的基础上完成下列查询&#xff1a; 1、在科室表…

【在线OJ系统】自定义注解实现分布式ID无感自增

实现思路 首先自定义参数注解&#xff0c;然后根据AOP思想&#xff0c;找到该注解作用的切点&#xff0c;也就是mapper层对于mapper层的接口在执行前都会执行该aop操作&#xff1a;获取到对于的方法对象&#xff0c;根据方法对象获取参数列表&#xff0c;根据参数列表判断某个…

大厂面试精华面试刷题

1.自定义unshift实现相同效果 2.数组去重 用vs2019来写这种练习题可以更直观的查看代码执行的效果&#xff0c;最后的代码是控制控制台执行完毕后不自动关闭 use strict;let arr [1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 8, 9, 10] //1.//查重最简单的方法for循环结合splice从数组中…

新版a_bogus算法分析以及成品展示调用

新版a_bogus算法的过程&#xff0c;仅学习参考&#xff0c;如有涉及侵权联系本人删除 最近看到这个参数花了点时间研究了一下 流程和X-Bogus差不多&#xff0c;通过对这段字符串概是对数据、ua、时间戳、浏览器的几个指纹进行计算&#xff0c;长度168位 下面是实现效果以及测…

java解决常见递归问题

最基本的&#xff0c;斐波那契数列&#xff0c;阶乘&#xff08;0&#xff0c;1的阶乘均为1&#xff09; 返回字母“x”第一次出现的位置 使用递归编写一个函数&#xff0c;读取一个字符串&#xff0c;返回字母“x”第一次出现的位置。例如&#xff0c;字符串 "abcdefgh…

Vue3+antd:表格中合并多行相同数据

注&#xff1a;本次以合并相同ID为示例 首先获取远程数据&#xff0c;获取完成之后对数据进行遍历 let customCellList []; // {start:0,length:2,id:xx} // 如果接口返回的数据相同ID之间不相邻&#xff0c;需要手动排序后才可以实现合并效果 res.data.forEach((item, inde…

使用共振峰提取元音音素/从声音生成口型动画

视频效果 我前段时间研究了下从声音提取共振峰的方法。今天测试了下实际效果。 我使用一段33秒的女声视频&#xff0c;提取元音后使用静态视位图序列生成了一个视频&#xff0c;效果如下&#xff1a; b站视频&#xff1a; https://www.bilibili.com/video/BV1JD421H7m9/?vd_…

基于SpringBoot+Vue的体检管理系统 免费获取源码

项目源码获取方式放在文章末尾处 项目技术 数据库&#xff1a;Mysql5.7/8.0 数据表&#xff1a;12张 开发语言&#xff1a;Java(jdk1.8) 开发工具&#xff1a;idea 前端技术&#xff1a;vue html 后端技术&#xff1a;SpringBoot 功能简介 (有文档) 项目获取关键字&…

Springboot+Vue项目-基于Java+MySQL的网上超市系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

【Redis】string数据类型

文章目录 常用命令setsetnx & NXXXsetex & EXpsetex & PX msetget & mgetincr & decrincrby & decrbyincrbyfloatappendgetrangesetrangestrlen 内部编码 字符串类型是 Redis 最基础的数据类型。 在redis中所有的键都是 string 类型&#xff0c;其他的…

[大模型]Qwen-Audio-chat FastApi 部署调用

Qwen-Audio-chat FastApi 部署调用 Qwen-Audio 介绍 Qwen-Audio 是阿里云研发的大规模音频语言模型&#xff08;Large Audio Language Model&#xff09;。Qwen-Audio 可以以多种音频 (包括说话人语音、自然音、音乐、歌声&#xff09;和文本作为输入&#xff0c;并以文本作为…

改进前后端交互实例

前后端交互实例(javaweb05)-CSDN博客 在这之前我假设大家都已经学完了IOC和DI 不明白的这里我也解释一下,首先是两个概念 1.控制反转:对象的创建控制权由程序自身转到外部(容器) 2.依赖注入:容器为程序提供运行时所依赖的资源 Bean对象:IOC容器中创建,关联的对象,称之为be…

蓝桥杯第十五界软件测试线下省赛题目分析及解决

PS 需要第十五界蓝桥杯被测系统或者功能测试模板、单元测试被测代码、自动化测试被测代码请加&#x1f427;:1940787338 备注&#xff1a;15界蓝桥杯省赛软件测试 题目1&#xff1a;功能测试 题目描述 ​ 某物流公司的货运收费标准根据重量、距离和节假日三个因素来确定。如…

MATLAB 体素滤波(62)

MATLAB 体素滤波(62) 一、算法介绍二、算法实现1.代码(已验证,直接运行)一、算法介绍 这里的代码完成文件读入,体素滤波,效果显示,结果输出的操作,下面是效果截图,后面是代码。 体素滤波(Voxel Filtering)是一种用于三维点云数据处理的方法,其原理类似于二维图像…

linux提权——提权大赏

文章目录 一、可读shadow文件利用提权二、可写shadow文件利用提权三、可写passwd文件利用提权四、sudo环境变量提权配置环境实验 五、自动任务文件权限提升配置环境实验 六、自动任务PATH环境变量提权七、自动任务通配符提权 一、可读shadow文件利用提权 ls -al /etc/shadow #…

JUC面试——⭐⭐Java中的四种引用类型/Threadlocal

四种引用类型 Java 中对象的引用分为四种级别&#xff0c;这四种级别由高到低依次为&#xff1a;强引用、软引用、弱引用和虚引用。 基础知识 强引用&#xff1a;普通使用的引用 强引用是造成 Java 内存泄漏的主要原因之一 软引用&#xff1a; GC内存不够时回收 适用于&…

RK3588 linux 修改ulimit 配置

前言 ulimit 主要是用来限制进程对资源的使用情况的&#xff0c;它支持各种类型的限制&#xff0c;常用的有&#xff1a; 内核文件的大小限制进程数据块的大小限制Shell进程创建文件大小限制可加锁内存大小限制常驻内存集的大小限制打开文件句柄数限制分配堆栈的最大大小限制C…

椋鸟数据结构笔记#10:排序·中

文章目录 四、归并排序时间复杂度实现递归实现非递归实现 测试稳定性 五、非比较排序5.1 计数排序时间复杂度实现测试局限性 5.2 桶排序时间复杂度实现测试 5.3 基数排序时间复杂度实现测试局限性 萌新的学习笔记&#xff0c;写错了恳请斧正。 四、归并排序 归并排序是一种非常…

pta L1-063 吃鱼还是吃肉

L1-063 吃鱼还是吃肉 分数 10 全屏浏览 切换布局 作者 陈越 单位 浙江大学 国家给出了 8 岁男宝宝的标准身高为 130 厘米、标准体重为 27 公斤&#xff1b;8 岁女宝宝的标准身高为 129 厘米、标准体重为 25 公斤。 现在你要根据小宝宝的身高体重&#xff0c;给出补充营养的…

java实现识别图片上的文字(OCR识别身份证等证件信息)

利用第三方jar包&#xff0c;实现识别图片上的文字。第三方支持地址&#xff1a;Spire.OCR for Java | 专业的图文识别组件&#xff0c;用以读取图片格式中的文本Spire.OCR for Java 是专为 Java 开发者设计的强大OCR库&#xff0c;提供高效的文字识别功能&#xff0c;能够从图…