对于八皇后问题,大家应该都不陌生,只要接触过算法的,必然都会接触到这到题。对于八皇后的问题不在此叙述,可以直接百度。对于八皇后问题的解决思路,可以直接根据题目的要求便可以得到。
总的来说,就是下一个皇后放置的点不能在上图所画的实线当中。
这里我仅考虑有多少种放置方法,而不考虑如何去放置。

深度优先搜索

DFS版本的解法应该是最普遍,直接通过回溯便可以解决。

def dfs(queues, xy_sum, xy_dif, num):global countrow = len(queues)if row == num:          # 所有皇后都放置完成count += 1for col in range(num):  # 一列一列的尝试放置if col not in queues and row+col not in xy_sum and row-col not in xy_dif:  # 列不冲突,左右斜线都不冲突dfs(queues+[col], xy_sum+[row+col], xy_dif+[row-col], num)  # 下一层的皇后global count
count = 0
dfs([], [], [], 4)
print(count)

广度优先搜索

广度优先与深度优先作为一对兄弟,竟然能使用深度优先搜索来实现,则必然也可通过广度优先来实现(感谢好兄弟的提醒)

def bfs(num):global countqueues = []   # 皇后点的队列# 初始化所有可能的点  也就是第一行中的所有点for i in range(num):    queues.append(tuple((0, i, [0], [i], [0+i], [0-i]))) # 点x, 点y,行,列,xy_sum, xy_difwhile queues:row, col, rows, cols, xy_sum, xy_dif = queues.pop(0)if row == num-1:  # 到达最后一行了,将结果加1,直接下一轮count += 1continuerow += 1for col in range(num):  # 判断每个位置是否可以存放if row not in rows and col not in cols and row+col not in xy_sum and row-col not in xy_dif:queues.append(tuple((row, col, rows+[row], cols+[col], xy_sum+[row+col], xy_dif+[row-col])))return countglobal count
count = 0
bfs(8)
print(count)

位运算

对于八皇后问题的解决,还有一种最不常见的方法,便是位运算,其实位运算的整体思路与DFS相似,只是通过使用位运算来进行判断以提高程序的运行速度。

def bitcom(row, col, xy_sum, xy_dif, num):global countif row == num:count += 1bits = (~(col|xy_sum|xy_dif)) & ((1<<num)-1)  # 得到有效空位 不放在col,xy_sum, xy_dif线上 & 获取后num位可放置的位置  while bits:p = bits & -bits  # 从后往前逐个获取可放置的位置  这边也就是从后朝前获取1的位置bitcom(row+1, col|p, (xy_sum|p)<<1, (xy_dif|p)>>1, num)   # col|p 为去掉刚刚放置的列   (xy_sum|p)<<1 下一行种当前斜线上不能放的位置置0bits = bits & (bits-1)  # 清零最低为的1,即将已放置过的位置置0global count
count = 0
bitcom(0, 0, 0, 0, 8)
print(count)

八皇后 深度优先 广度优先 位运算相关推荐

  1. N皇后问题的位运算求解——目前最快的方法

    核心代码如下: 1 void test(int row, int ld, int rd) 2 { 3 int pos, p; 4 if ( row != upperlim ) 5 { 6 pos = ...

  2. n皇后问题,使用位运算解决

    public class NQueue {public static void main(String[] args) {int n = 8;//int limit = n == 32 ? -1 :( ...

  3. usaco Section 1.5 Checker Challenge 最慢0.162秒0.0+n皇后问题位运算版(C语言)

    今天做USACO做到Section 1.5的Checker Challenge 直接dfs之后的结果是,超时.. 百度查查才想起来就是八皇后问题.有人讲怎么利用对称性怎么怎么优化,我没仔细看 直到看到 ...

  4. JavaScript 位运算总结拾遗

    最近补充了一些位运算的知识,深感位运算的博大精深,此文作为这个系列的总结篇,在此回顾下所学的位运算知识和应用,同时也补充下前文中没有提到的一些位运算知识. 把一个数变为大于等于该数的最小的2的幂 一个 ...

  5. 【Python位运算】——左移操作(<<)右移操作>>

    目录 左移操作 右移操作 其他博主的理解 应用--力扣题目78. 子集 解法 深度优先搜索 位运算 参考文献 左移操作 # 左移操作,左移一位相当于乘以b,a<<b,a' = a*(2^b ...

  6. 位运算(3)-- 高级运用

    注:此文内容来自于对[数据结构与算法之位运算]课程所做的笔记 一.二进制中1的个数 问题:给定一个无符号整型变量,求其二进制表示中"1"的个数. 相似问题:判断整数A转换成整数B需 ...

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

    题目: LeetCode 51. N-Queens 分析: N 皇后问题是考查递归回溯的经典问题,深度优先搜索的难点在于如何剪枝,在这个问题里面的剪枝,我们需要利用额外的空间去记录当前行的有效空位,只 ...

  8. 洛谷P1562 还是N皇后(DFS+状态压缩+位运算)

    八皇后问题的介绍在此不再赘述,只贴一下经典八皇后问题的实现代码(参考刘汝佳 <算法竞赛入门经典>) void search(int i) {if(i>n){ans++;return; ...

  9. n皇后 - 位运算版

    n皇后问题是大家在递归里会碰到的一个经典问题.以前高中我学DFS的时候,老师首先让我看的就是八皇后. 不过这皇后的时间复杂度大家可想而知了.而接下来的位运算将这个效率重新提到一个高度. 我是以前在Ma ...

最新文章

  1. 继智能手机之后,增强现实如何再次改变我们与世界的交互方式
  2. MySQL 数据库命令
  3. Windows Azure开发者任务之五:配置虚拟机的“规模”
  4. java 分布式电子商务云平台b2b b2c o2o需要准备哪些技术??
  5. wine的sys文件具体位置
  6. why some product does not have Note assignment block
  7. sap采购订单更改记录_SAP系统如何实现减税:增值税16%
  8. javacv 写mp4_JavaCV实现获取视频每帧并保存
  9. zoom 用户被锁定_重新考虑Zoom的用户体验
  10. MATLAB电压不平衡,电力系统不对称故障计算的Matlab算法程序
  11. android系统中与内存有关的文件及路径
  12. JavaScript 中 call()、apply()、bind() 的用法
  13. 大一计算机基础ppt练习题,计算机基础知识PPT练习题及答案DOC
  14. linux镜像迅雷下载,【转】红帽 Red Hat Linux相关产品iso镜像下载【迅雷快传】【百度云】【更新7.1】...
  15. 分析图片相似度的软件,图片相似度比对算法
  16. Python流程控制
  17. Mac没有winnt格式_Mac磁盘到底要不要分区?
  18. ios objective-c将base64位编码字符串转换成图片
  19. 我们到底在恐惧什么?
  20. Antd Vue 表单生成快速开发指南,内附强大的表单设计器

热门文章

  1. 亲爱的百度,您带着bug翩翩走来……呃
  2. 拉灯问题c语言编程,行测答题技巧:数量关系拉灯问题
  3. 看了你就知道为什么iTunes要对电脑授权了
  4. 当程序猿修真,这个世界会怎样!
  5. 计算机相关的趣事,趣事的日记3篇
  6. C语言编程题:相似三角形(sdut oj)
  7. 华南师范计算机科学学院院长,曾碧卿教授 - 导师团队成员简介 - 华南师范大学软件学院...
  8. SQL_BOY的另类“CRUD”能力
  9. 数学基础-Jensen不等式
  10. strcat函数用法