[算法入土之路]n皇后问题(位运算加速)

2024-03-24 23:08

本文主要是介绍[算法入土之路]n皇后问题(位运算加速),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

n皇后问题的算法规模为 O(n^n) 无法改变, 但是我们可以在常数上做优化(通过位运算)

def NQueens(n):'''利用位运算提高运算速率:param n: 几个皇后:return:'''n = (1 << n) - 1  # 生成二进制为 n 个 1 的数字def inner(n_, col, left, right):''':param n_: 总行: 例: 八皇后 n_ = 0」11111111:param col: 列限制:param left: 左斜线限制:param right: 右斜线限制:return: 当前获得解的个数'''if col == n_:  # 当绘制完最后一行 得到一个解return 1pos = n_ & (~(col | left | right))'''n」 表示前面无限为都是ncol | left | right -> 0」 0 代表可以放皇后的位置, 1 代表不可以放皇后的位置~ -> 1」 1 代表可以放皇后的位置 0 代表不可以放皇后的位置n_ & -> 0」1 代表可以放皇后的位置 0 代表不可以放皇后的位置'''res = 0  # 解的个数while pos:  # 如果还有皇后可以放置的位置cur_loc = pos & (~pos + 1)  # 获得最右面的一个1 即从右往左找皇后可以放置的位置pos -= cur_loc  # 使当前可以放置皇后的位置变为不可以放置皇后的位置res += inner(n_, col | cur_loc, (left | cur_loc) << 1, (right | cur_loc) >> 1)'''例子: 八皇后最外层第一次循环              八皇后第二层 第一次循环pri_seq    1 1 1 1 1 1 1 1          pri_seq    1 1 1 1 1 1 1 1     # 原始序列        pos        1 1 1 1 1 1 1 1          pos        1 1 1 1 1 1 0 0     # 当前可以放置皇后的位置left       0 0 0 0 0 0 0 0          left       0 0 0 0 0 0 1 0     # 左限制right      0 0 0 0 0 0 0 0          right      0 0 0 0 0 0 0 0     # 右限制cur_loc    0 0 0 0 0 0 0 1          cur_loc    0 0 0 0 0 1 0 0     # 当前获得的可以放置皇后的位置left|cur   0 0 0 0 0 0 0 1          left|cur   0 0 0 0 0 1 1 0     # 左限制与当前皇后位置作 或操作↑ << 1     0 0 0 0 0 0 1 0          ↑ << 1     0 0 0 0 1 1 0 0     # 向左移一位 代表下一行的左限制right|cur  0 0 0 0 0 0 0 1          right|cur  0 0 0 0 0 0 1 0     # 右限制与当前皇后位置作 或操作 ↑ >> 1     0 0 0 0 0 0 0 0          ↑ >> 1     0 0 0 0 0 0 0 1     # 向右移一位 代表下一行的右限制'''return resreturn inner(n, 0, 0, 0)print(NQueens(4))

这篇关于[算法入土之路]n皇后问题(位运算加速)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/843080

相关文章

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

MySQL 设置AUTO_INCREMENT 无效的问题解决

《MySQL设置AUTO_INCREMENT无效的问题解决》本文主要介绍了MySQL设置AUTO_INCREMENT无效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录快速设置mysql的auto_increment参数一、修改 AUTO_INCREMENT 的值。

关于跨域无效的问题及解决(java后端方案)

《关于跨域无效的问题及解决(java后端方案)》:本文主要介绍关于跨域无效的问题及解决(java后端方案),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录通用后端跨域方法1、@CrossOrigin 注解2、springboot2.0 实现WebMvcConfig

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

Java死锁问题解决方案及示例详解

《Java死锁问题解决方案及示例详解》死锁是指两个或多个线程因争夺资源而相互等待,导致所有线程都无法继续执行的一种状态,本文给大家详细介绍了Java死锁问题解决方案详解及实践样例,需要的朋友可以参考下... 目录1、简述死锁的四个必要条件:2、死锁示例代码3、如何检测死锁?3.1 使用 jstack3.2

解决JSONField、JsonProperty不生效的问题

《解决JSONField、JsonProperty不生效的问题》:本文主要介绍解决JSONField、JsonProperty不生效的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录jsONField、JsonProperty不生效javascript问题排查总结JSONField

github打不开的问题分析及解决

《github打不开的问题分析及解决》:本文主要介绍github打不开的问题分析及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、找到github.com域名解析的ip地址二、找到github.global.ssl.fastly.net网址解析的ip地址三

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地

springboot加载不到nacos配置中心的配置问题处理

《springboot加载不到nacos配置中心的配置问题处理》:本文主要介绍springboot加载不到nacos配置中心的配置问题处理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录springboot加载不到nacos配置中心的配置两种可能Spring Boot 版本Nacos

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co