这里是对于周一课上的老师教学的python八皇后问题的个人学习记录

八皇后问题出自国际象棋:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名八皇后问题。 对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2…b8,其中bi为相应摆法中第i行皇后所处的列数。已经知道8皇后问题一共有92组解(即92个不同的皇后串)

那么python怎么实现以及对于八皇后问题的求解呢?鉴于初学者水平只能讲讲递归回溯算法对于八皇后问题的求解

核心代码如下:

def isNotConfict(queen, row):   #判断是否冲突for i in range(0, row):if queen[i] == queen[row] or abs(i - row) == abs(queen[i] - queen[row]):return Falsereturn True

对于皇后间不能在同一行,以及在对角线位置,这里采用循环遍历的方式,前一个皇后与后一个皇后之间的行数不等,对角线下表元素相减绝对值也不能等判断其位置是否冲突,这里采用老师给的代码

def confict(state,nextX):nextY=len(state)for i in range(nextY):if abs(state[i]-nextX)in(0,nextY-i):return Truereturn False

同一垂直线上abs(state[i]-nextX)==0,对角线上abs(state[i]-nextX)==nextY-i

把已知的皇后位置传给conflict函数进行判断,决定下一个皇后的位置是否会产生冲突


当只剩最后一个皇后时,只需要根据其他皇后位置自动形成他合适位置

def queen(num,state):if len(state)==num-1:for pos in range(num):if not conflict(state,pos):yield pos

这里采用生成器的方法,需要递归的方法,完成基本情况后需要做的就是为前面的queens函数实现if语句后增加else语句,在递归中想要得到更高位置皇后的位置,需要将位置信息作为一个元组返回,即yield(pos,),为了继续运行,需要把当前位置信息添加到元组中并传入给后面的皇后

else:for pos in range(num):if not conflict(state,pos):for result in queens(num,state+(pos,)): yield(pos,)+result

老师完整代码,采用了元组不可个更改的性质,生成器yield自动循环遍历下一个皇后的位置


def conflict(state, nextX):nextY = len(state)for i in range(nextY):if abs(state[i]-nextX) in (0, nextY-i):return Truereturn False
def queens(num, state=()):for pos in range(num):if not conflict(state, pos):if len(state) == num-1:yield (pos, )else:for result in queens(num, state+(pos,)):yield (pos, ) + result

关于python的八皇后问题递归算法详解相关推荐

  1. 经典回溯算法(八皇后问题)详解

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九世纪著名的数学家高斯1850年提出: 在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列 ...

  2. Python解决八皇后问题

    Python解决八皇后问题 参考文章: (1)Python解决八皇后问题 (2)https://www.cnblogs.com/littleseven/p/5362791.html 备忘一下.

  3. 八皇后 C++ 递归算法和循环嵌套算法 共得到 92 种题解

    八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后,为了达到此目的,任两个皇后都不能处于同一条横行.纵行或斜线上.八皇后问题 ...

  4. python画图三维-对python mayavi三维绘图的实现详解

    网上下载mayavi的官方帮助文档,里面有很多例子,下面的记录都是查看手册后得到的. python的mayavi.mlab库中的绘图函数有很多候选参数,但下文记录并没有过多讨论,本人也是需要用到才查看 ...

  5. python镜像下载包_python包详解

    干货大礼包!21天带你轻松学Python(文末领取更多福利) 点击查看课程视频地址 本课程来自于千锋教育在阿里云开发者社区学习中心上线课程<Python入门2020最新大课>,主讲人姜伟. ...

  6. 21年最新Python面试题及答案汇总详解(上)

    错过三月找工作的机会,还要错过四月的好时期吗?Python面试你做准备了吗?下面小编整理了一套2021年最新Python常见面试题目,及Python面试题目答案汇总.希望能够帮助到大家. 21年最新P ...

  7. python popen阻塞_对Python subprocess.Popen子进程管道阻塞详解

    问题产生描述 使用子进程处理一个大的日志文件,并对文件进行分析查询,需要等待子进程执行的输出结果,进行下一步处理. 出问题的代码 # 启用子进程执行外部shell命令 def __subprocess ...

  8. python平方数迭代器_对python中的高效迭代器函数详解

    python中内置的库中有个itertools,可以满足我们在编程中绝大多数需要迭代的场合,当然也可以自己造轮子,但是有现成的好用的轮子不妨也学习一下,看哪个用的顺手~ 首先还是要先import一下: ...

  9. python画动图-Python绘制动态水球图过程详解

    先来看看绘制的动态水球图: 没有安装PyEcharts的,先安装PyEcharts: # 安装pyecharts模块,直接安装就是最新的版本pip install pyecharts 安装好PyEch ...

最新文章

  1. 面试了一个32岁的大佬,明显感觉到他背过很多面试题…
  2. OpenCV全向相机校准Omnidirectional Camera Calibration
  3. STL - 底层实现
  4. 复习Javascript专题(一):基本概念部分
  5. 随机生成一定范围的随机数
  6. P4570 [BJWC2011]元素(线性基+贪心)
  7. 夺命雷公狗-----React---5--props对象的传递
  8. php导出excel加换行,php导出excel单元格自动换行怎么实现?
  9. kuka机器人程序是c语言吗,KUKA机器人示教器编程问题讲解——KUKA机器人
  10. 微信扫码支付开发流程
  11. android studio如何连接夜神模拟器
  12. 工作15年码农总结:学编程难吗?那只是你觉得难!
  13. 什么是核心文件,它们什么时候有用
  14. 基于ADS1298的心电图仪
  15. 三星笔记本bios设置里找不到U盘启动盘的解决方法
  16. vbs介绍与常见整人代码
  17. MySQL OCP报考流程
  18. word中右键图片菜单没有更改图片选项
  19. 细细品味C#——重构的艺术
  20. MATLAB中var函数,mean函数的含义及用法详细解释

热门文章

  1. 什么是荟萃分析?荟萃分析与Meta分析有什么区别?
  2. cnpm安装vue-cli2
  3. 浅析市场分析的三个方法
  4. three.js orbitcontrol更改绕x轴与z轴旋转
  5. java面试宝典(自己先留着)
  6. android n模拟器,BlueStacks 推出 Android N 模拟器
  7. [博创智联]创新创客智能硬件平台——温湿度传感器
  8. phy (LAN8720 RTL8201)自动极性 自动协商在PCB LAYOUT中应用
  9. idea icon,方便好用的快捷按钮
  10. 【记录】炉石传说 IOS 端 稳定 crash 复现