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

算法【N皇后问题位运算实现】

N皇后问题是一个经典的回溯算法问题,解决N皇后问题的时间复杂度是O(n!),好的方法可以大量剪枝,大量优化常数时间。

用数组表示路径的方法(经典、常数时间慢,不推荐)

1.记录之前每一行的皇后放在了什么列

2.来到第i行的时候,可以根据0..i-1行皇后的位置,判断能放哪些列 

3.把能放的列都尝试一遍,每次尝试修改路径数组表示当前的决策,后续返回的答案都累加返回

用位运算的方法(巧妙、常数时间快,推荐)

1.int col: 0..i-1行皇后放置的位置因为正下方向延伸的原因,哪些列不能再放皇后

2.int left: 0..i-1行皇后放置的位置因为左下方向延伸的原因,哪些列不能再放皇后

3.int right: 0..i-1行皇后放置的位置因为右下方向延伸的原因,哪些列不能再放皇后

4.根据col、left、right,用位运算快速判断能放哪些列

5.把能放的列都尝试一遍,每次尝试修改3个数字表示当前的决策,后续返回的答案都累加返回

测试链接:https://leetcode.cn/problems/n-queens-ii/

分析:对于位置能否放置皇后采用位运算的方式判断。

代码如下。

class Solution {
public:int totalNQueens(int n) {int ans = 0;f(0, 0, 0, 0, ans, n);return ans;}void f(int row, int col, int left, int right, int &ans, int n){if(row == n){ans++;return;}int ban = ~(col | left | right);for(int i = 0;i < n;++i){if(((ban >> i) & 1) == 1){int place = (1 << i);f(row+1, col | place, (left | place)>>1, (right | place)<<1, ans, n);}}}
};

其中,ans表示个数,row表示进行到第几行,col、left、right表示分别从竖直、右上到左下、左上到右下三个方向上哪些列不能被放置,1为不能,0为能。ban在col、left、right或之后取反可以得到哪些列还可以放置,1为可放置,0为不可放置。遍历找到可放置的列,place中1的位数代表当前行皇后放在哪列。更新col、left、right。 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于SpringBoot+Vue的校园便利平台(带1w+文档)
  • 当 iOS 系统遇到卡顿现象,有哪些有效的解决方法?
  • 使用CLI脚手架搭建Vue2项目
  • python-鼠标绘画线条程序
  • 跟《经济学人》学英文:2024年07月27日这期 AI firms will soon exhaust most of the internet’s data
  • 【Docker】Dockerfile 文件编写
  • 基于SpringBoot+Vue的校车调度管理系统(带1w+文档)
  • CF 训练2
  • 记录使用FlinkSql进行实时工作流开发
  • 如何强化学习神经网络
  • 进程状态(一)---- 运行,阻塞,挂起
  • ESP8266+STM32+阿里云保姆级教程(AT指令+MQTT)
  • HBuilder在uni-admin实现unicloud-map中poi管理
  • linux 虚拟机解压arm-linux-gcc-4.6.4-arm-x86_64.tar.bz2并arm-linux-gcc
  • openEuler使用mariadb
  • [笔记] php常见简单功能及函数
  • DOM的那些事
  • Java Agent 学习笔记
  • Javascript Math对象和Date对象常用方法详解
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • Redis中的lru算法实现
  • v-if和v-for连用出现的问题
  • 成为一名优秀的Developer的书单
  • 回流、重绘及其优化
  • 每天10道Java面试题,跟我走,offer有!
  • 你真的知道 == 和 equals 的区别吗?
  • 如何在GitHub上创建个人博客
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • Spring Batch JSON 支持
  • Spring第一个helloWorld
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​学习一下,什么是预包装食品?​
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #php的pecl工具#
  • $nextTick的使用场景介绍
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (145)光线追踪距离场柔和阴影
  • (C++20) consteval立即函数
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (七)Flink Watermark
  • (转)大道至简,职场上做人做事做管理
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • *上位机的定义
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net core控制台应用程序初识
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .Net 代码性能 - (1)
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .net 受管制代码