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编程中的反模式实例分析
Dec 08 Python
编写Python脚本来获取mp3文件tag信息的教程
May 04 Python
Python2.x版本中cmp()方法的使用教程
May 14 Python
Python中内建函数的简单用法说明
May 05 Python
用Python设计一个经典小游戏
May 15 Python
老生常谈Python基础之字符编码
Jun 14 Python
matplotlib在python上绘制3D散点图实例详解
Dec 09 Python
matplotlib中legend位置调整解析
Dec 19 Python
pycharm+django创建一个搜索网页实例代码
Jan 24 Python
pandas中的DataFrame按指定顺序输出所有列的方法
Apr 10 Python
python制作mysql数据迁移脚本
Jan 01 Python
python实现简单的井字棋游戏(gui界面)
Jan 22 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
function.inc.php超越php
2006/12/09 PHP
PHP加密扩展库Mcrypt安装和实例
2013/11/10 PHP
PHP实现支持GET,POST,Multipart/form-data的HTTP请求类
2014/09/24 PHP
通过Email发送PHP错误的方法
2015/07/20 PHP
PHP创建XML的方法示例【基于DOMDocument类及SimpleXMLElement类】
2019/09/10 PHP
用CSS+JS实现的进度条效果效果
2007/06/05 Javascript
javascript css float属性的特殊写法
2008/11/13 Javascript
js Function类型
2011/12/04 Javascript
多种方法实现load加载完成后把图片一次性显示出来
2014/02/19 Javascript
面向切面编程(AOP)的理解
2015/05/01 Javascript
jQuery数据检索中根据关键字快速定位GridView指定行的实现方法
2016/06/08 Javascript
Web程序员必备的7个JavaScript函数
2016/06/14 Javascript
使用jQuery,Angular实现登录界面验证码详解
2017/04/27 jQuery
JS实现的数组去除重复数据算法小结
2017/11/17 Javascript
Angular中使用MathJax遇到的一些问题
2017/12/15 Javascript
VueAwesomeSwiper在VUE中的使用以及遇到的一些问题
2018/01/11 Javascript
原生JS实现前端本地文件上传
2018/09/08 Javascript
vue 的点击事件获取当前点击的元素方法
2018/09/15 Javascript
js实现简单的贪吃蛇游戏
2020/04/23 Javascript
python三元运算符实现方法
2013/12/17 Python
Python Django中间件,中间件函数,全局异常处理操作示例
2019/11/08 Python
python将dict中的unicode打印成中文实例
2020/05/11 Python
python3跳出一个循环的实例操作
2020/08/18 Python
安装pyinstaller遇到的各种问题(小结)
2020/11/20 Python
Python APScheduler执行使用方法详解
2020/12/10 Python
html5中svg canvas和图片之间相互转化思路代码
2014/01/24 HTML / CSS
ORACLE十问
2015/04/20 面试题
求职信内容考虑哪几点
2013/10/05 职场文书
大学生个人推荐信范文
2013/11/25 职场文书
汽车运用工程专业毕业生推荐信
2013/12/25 职场文书
老同学聚会感言
2014/02/23 职场文书
超市开店计划书
2014/09/15 职场文书
浪漫婚礼主题活动策划方案
2014/09/15 职场文书
关于感恩的素材句子(38句)
2019/11/11 职场文书
如何有效防止sql注入的方法
2021/05/25 SQL Server
MySQL如何快速创建800w条测试数据表
2022/03/17 MySQL