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读写unicode文件的方法
Jul 10 Python
python实现对指定输入的字符串逆序输出的6种方法
Apr 26 Python
Python django使用多进程连接mysql错误的解决方法
Oct 08 Python
Python进阶之自定义对象实现切片功能
Jan 07 Python
python3中eval函数用法使用简介
Aug 02 Python
pytest中文文档之编写断言
Sep 12 Python
pyinstaller还原python代码过程图解
Jan 08 Python
使用K.function()调试keras操作
Jun 17 Python
python Cartopy的基础使用详解
Nov 01 Python
python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境
Dec 14 Python
python入门学习关于for else的特殊特性讲解
Nov 20 Python
解析python中的jsonpath 提取器
Jan 18 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
模板引擎正则表达式调试小技巧
2011/07/20 PHP
php代码收集表单内容并写入文件的代码
2012/01/29 PHP
隐性调用php程序的方法
2015/06/13 PHP
PHP定时执行任务实现方法详解(Timer)
2015/07/30 PHP
PHP中explode函数和split函数的区别小结
2016/08/24 PHP
PHP chunk_split()函数讲解
2019/02/12 PHP
微信推送功能实现方式图文详解
2019/07/12 PHP
javascript 面向对象编程基础 多态
2009/08/21 Javascript
从零开始学习jQuery (八) 插播:jQuery实施方案
2011/02/23 Javascript
JavaScript插入动态样式实现代码
2012/02/22 Javascript
关于Jquery操作Cookie取值错误的解决方法
2013/08/26 Javascript
js 时间格式与时间戳的相互转换示例代码
2013/12/25 Javascript
让table变成exls的示例代码
2014/03/24 Javascript
JQuery中使用on方法绑定hover事件实例
2014/12/09 Javascript
详解JavaScript中的客户端消息框架设计原理
2015/06/24 Javascript
JavaScript中Date对象的常用方法示例
2015/10/24 Javascript
jquery解析json格式数据的方法(对象、字符串)
2015/11/24 Javascript
javascript针对不确定函数的执行方法
2015/12/16 Javascript
jquery点击切换背景色的简单实例
2016/08/25 Javascript
jQuery实现最简单的切换图效果【可兼容IE6、火狐、谷歌、opera等】
2016/09/04 Javascript
JavaScript类的写法
2016/09/17 Javascript
ajax与json 获取数据并在前台使用简单实例
2017/01/19 Javascript
BootStrap 图片样式、辅助类样式和CSS组件的实例详解
2017/01/20 Javascript
纯JS实现只能输入数字的简单代码
2017/06/21 Javascript
JavaScript求一组数的最小公倍数和最大公约数常用算法详解【面向对象,回归迭代和循环】
2018/05/07 Javascript
详解React native fetch遇到的坑
2018/08/30 Javascript
解决Antd Table表头加Icon和气泡提示的坑
2020/11/17 Javascript
python中def是做什么的
2020/06/10 Python
anaconda3安装及jupyter环境配置全教程
2020/08/24 Python
中国梦演讲稿教师篇
2014/04/23 职场文书
区长工作作风个人整改措施
2014/10/01 职场文书
毕业设计论文评语
2014/12/31 职场文书
付款证明模板
2015/06/19 职场文书
用Python的绘图库(matplotlib)绘制小波能量谱
2021/04/17 Python
一文搞懂MySQL索引页结构
2022/02/28 MySQL
永中文档在线转换预览基于nginx配置部署方案
2022/06/10 Servers