Python基于回溯法子集树模板实现8皇后问题


Posted in Python onSeptember 01, 2017

本文实例讲述了Python基于回溯法子集树模板实现8皇后问题。分享给大家供大家参考,具体如下:

问题

8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

Python基于回溯法子集树模板实现8皇后问题

分析

为了简化问题,考虑到8个皇后不同行,则每一行放置一个皇后,每一行的皇后可以放置于第0、1、2、...、7列,我们认为每一行的皇后有8种状态。那么,我们只要套用子集树模板,从第0行开始,自上而下,对每一行的皇后,遍历它的8个状态即可。

代码:

'''
8皇后问题
'''
n = 8 
x = [] # 一个解(n元数组)
X = [] # 一组解
# 冲突检测:判断 x[k] 是否与前 x[0~k-1] 冲突
def conflict(k):
 global x
 for i in range(k):        # 遍历前 x[0~k-1]
  if x[i]==x[k] or abs(x[i]-x[k])==abs(i-k): # 判断是否与 x[k] 冲突
   return True
 return False
# 套用子集树模板
def queens(k): # 到达第k行
 global n, x, X
 if k >= n:   # 超出最底行
  #print(x)
  X.append(x[:]) # 保存(一个解),注意x[:]
 else:
  for i in range(n): # 遍历第 0~n-1 列(即n个状态)
   x.append(i)  # 皇后置于第i列,入栈
   if not conflict(k): # 剪枝
    queens(k+1)
   x.pop()   # 回溯,出栈
# 解的可视化(根据一个解x,复原棋盘。'X'表示皇后)
def show(x):
 global n
 for i in range(n):
  print('. ' * (x[i]) + 'X ' + '. '*(n-x[i]-1))
# 测试
queens(0) # 从第0行开始
print(X[-1], '\n')
show(X[-1])

效果图

Python基于回溯法子集树模板实现8皇后问题

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python实现树的先序、中序、后序排序算法示例
Jun 23 Python
python的dataframe和matrix的互换方法
Apr 11 Python
python flask安装和命令详解
Apr 02 Python
浅析Python 引号、注释、字符串
Jul 25 Python
python列表插入append(), extend(), insert()用法详解
Sep 14 Python
python中class的定义及使用教程
Sep 18 Python
Python使用gluon/mxnet模块实现的mnist手写数字识别功能完整示例
Dec 18 Python
python实现按关键字筛选日志文件
Dec 24 Python
keras K.function获取某层的输出操作
Jun 29 Python
Python子进程subpocess原理及用法解析
Jul 16 Python
教你使用Sublime text3搭建Python开发环境及常用插件安装另分享Sublime text3最新激活注册码
Nov 12 Python
PYTHON基于Pyecharts绘制常见的直角坐标系图表
Apr 28 Python
Python3.x对JSON的一些操作示例
Sep 01 #Python
Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能示例
Aug 31 #Python
Python+Socket实现基于UDP协议的局域网广播功能示例
Aug 31 #Python
python requests 使用快速入门
Aug 31 #Python
如何高效使用Python字典的方法详解
Aug 31 #Python
利用Python爬取微博数据生成词云图片实例代码
Aug 31 #Python
Python利用ElementTree模块处理XML的方法详解
Aug 31 #Python
You might like
第十三节 对象串行化 [13]
2006/10/09 PHP
怎样给PHP源代码加密?PHP二进制加密与解密的解决办法
2013/04/22 PHP
php通过数组实现多条件查询实现方法(字符串分割)
2014/05/06 PHP
PHP图片添加水印功能示例小结
2016/10/03 PHP
PHP接口并发测试的方法(推荐)
2016/12/15 PHP
PHP解析url并得到url参数方法总结
2018/10/11 PHP
几个比较实用的JavaScript 测试及效验工具
2010/04/18 Javascript
jQuery调用WebService的实现代码
2011/06/19 Javascript
利用JS延迟加载百度分享代码,提高网页速度
2013/07/01 Javascript
javascript处理表单示例(javascript提交表单)
2014/04/28 Javascript
JavaScript函数获取事件源的小例子
2014/05/14 Javascript
javascript从image转换为base64位编码的String
2014/07/29 Javascript
JS实现的竖向折叠菜单代码
2015/10/21 Javascript
javascript数据结构之二叉搜索树实现方法
2015/11/25 Javascript
用Nodejs搭建服务器访问html、css、JS等静态资源文件
2017/04/28 NodeJs
JavaScript设计模式之装饰者模式定义与应用示例
2018/07/25 Javascript
深入浅出了解Node.js Streams
2019/05/27 Javascript
el-select数据过多懒加载的解决(loadmore)
2019/05/29 Javascript
vue中的 $slot 获取插槽的节点实例
2019/11/12 Javascript
vue基于Echarts的拖拽数据可视化功能实现
2020/12/04 Vue.js
使用Python中的greenlet包实现并发编程的入门教程
2015/04/16 Python
python距离测量的方法
2018/03/06 Python
Python直接赋值、浅拷贝与深度拷贝实例分析
2019/06/18 Python
详解基于python-django框架的支付宝支付案例
2019/09/23 Python
Python计算机视觉里的IOU计算实例
2020/01/17 Python
python 操作excel表格的方法
2020/12/05 Python
python 实现端口扫描工具
2020/12/18 Python
先进党支部事迹材料
2014/01/13 职场文书
树转促学习心得体会
2014/09/10 职场文书
党员个人剖析材料2014
2014/10/08 职场文书
交通事故协议书范本
2014/11/18 职场文书
2014年督导工作总结
2014/11/19 职场文书
预备党员转正材料
2014/12/19 职场文书
优秀大学生事迹材料
2014/12/24 职场文书
天鹅湖观后感
2015/06/09 职场文书
python 办公自动化——基于pyqt5和openpyxl统计符合要求的名单
2021/05/25 Python