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下singleton模式的实现方法
Jul 16 Python
python爬虫入门教程之糗百图片爬虫代码分享
Sep 02 Python
Python计算三角函数之asin()方法的使用
May 15 Python
python实现多线程的方式及多条命令并发执行
Jun 07 Python
python实现NB-IoT模块远程控制
Jun 20 Python
pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法
Jun 20 Python
python django 原生sql 获取数据的例子
Aug 14 Python
Python插件机制实现详解
May 04 Python
python将dict中的unicode打印成中文实例
May 11 Python
python爬虫请求头的使用
Dec 01 Python
Jupyter Notebook 安装配置与使用详解
Jan 06 Python
Python机器学习三大件之一numpy
May 10 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
PHP表单递交控件名称含有点号(.)会被转化为下划线(_)的处理方法
2013/01/06 PHP
PHP echo,print,printf,sprintf函数之间的区别与用法详解
2013/11/27 PHP
php实现字符串首字母大写和单词首字母大写的方法
2015/03/14 PHP
谈谈 PHP7新增功能
2015/12/16 PHP
php图片上传类 附调用方法
2016/05/15 PHP
PHP连接MYSQL数据库的3种常用方法
2017/02/27 PHP
PHP实现微信退款的方法示例
2019/03/26 PHP
防止文件缓存的js代码
2013/01/10 Javascript
15条JavaScript最佳实践小结
2013/08/09 Javascript
基于MVC3方式实现下拉列表联动(JQuery)
2013/09/02 Javascript
jQuery Ajax中的事件详细介绍
2015/04/16 Javascript
javascript实现对表格元素进行排序操作
2015/11/18 Javascript
javascript简易画板开发
2020/04/12 Javascript
js导出excel文件的简洁方法(推荐)
2016/11/02 Javascript
原生js实现水平方向无缝滚动
2017/01/10 Javascript
JavaScript中set与get方法用法示例
2018/08/15 Javascript
vue中typescript装饰器的使用方法超实用教程
2019/06/17 Javascript
layui复选框的全选与取消实现方法
2019/09/02 Javascript
Vue页面切换和a链接的本质区别详解
2019/11/12 Javascript
[03:20]2015国际邀请赛全明星表演赛
2015/08/08 DOTA
Python 返回汉字的汉语拼音
2009/02/27 Python
Python中运行并行任务技巧
2015/02/26 Python
Python向日志输出中添加上下文信息
2017/05/24 Python
Python实现的爬虫功能代码
2017/06/24 Python
Python本地及虚拟解释器配置过程解析
2020/10/13 Python
python实现简单猜单词游戏
2020/12/24 Python
GLAMGLOW香港官网:明星出镜前的秘密武器
2017/03/16 全球购物
以特惠价提供在线奢侈品购物:FRMODA.com
2018/01/25 全球购物
如何用Python来进行查询和替换一个文本字符串
2014/01/02 面试题
关于旷工的检讨书
2014/02/02 职场文书
英文求职信范文
2014/05/23 职场文书
工程安全生产协议书
2014/11/21 职场文书
贪污检举信范文
2015/03/02 职场文书
小学教师师德师风承诺书
2015/04/28 职场文书
压缩Redis里的字符串大对象操作
2021/06/23 Redis
Python数组变形的几种实现方法
2022/05/30 Python