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调用cmd命令行制作刷博器
Jan 13 Python
python实现爬虫统计学校BBS男女比例(一)
Dec 31 Python
Python正则表达式经典入门教程
May 22 Python
python读取文本绘制动态速度曲线
Jun 21 Python
pygame游戏之旅 添加icon和bgm音效的方法
Nov 21 Python
django admin.py 外键,反向查询的实例
Jul 26 Python
python中sort和sorted排序的实例方法
Aug 26 Python
django框架中ajax的使用及避开CSRF 验证的方式详解
Dec 11 Python
500行python代码实现飞机大战
Apr 24 Python
python如何查看安装了的模块
Jun 23 Python
django数据模型中null和blank的区别说明
Sep 02 Python
Python hashlib模块的使用示例
Oct 09 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
国王的咖啡这么大来头,名字的由来是什么
2021/03/03 咖啡文化
Email+URL的判断和自动转换函数
2006/10/09 PHP
一些PHP写的小东西
2006/12/06 PHP
Windows7下PHP开发环境安装配置图文方法
2010/05/20 PHP
注意:php5.4删除了session_unregister函数
2013/08/05 PHP
IE6下js通过css隐藏select的一个bug
2010/08/16 Javascript
file控件选择上传文件确定后触发的js事件是哪个
2014/03/17 Javascript
json中换行符的处理方法示例介绍
2014/06/10 Javascript
使用jquery解析XML的方法
2014/09/05 Javascript
用户代理字符串userAgent可实现的四个识别
2015/09/20 Javascript
Bootstrap实现带动画过渡的弹出框
2016/08/09 Javascript
通过构造函数实例化对象的方法
2017/06/28 Javascript
vue基于Element构建自定义树的示例代码
2017/09/19 Javascript
VueAwesomeSwiper在VUE中的使用以及遇到的一些问题
2018/01/11 Javascript
js中split()方法得到的数组长度问题
2018/07/19 Javascript
Vue动态面包屑功能的实现方法
2019/07/01 Javascript
js中比较两个对象是否相同的方法示例
2019/09/02 Javascript
[44:40]KG vs LGD 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python中shapefile转换geojson的示例
2019/01/03 Python
如何在Django中设置定时任务的方法示例
2019/01/18 Python
django 做 migrate 时 表已存在的处理方法
2019/08/31 Python
解决python脚本中error: unrecognized arguments: True错误
2020/04/20 Python
Softmax函数原理及Python实现过程解析
2020/05/22 Python
Python图像阈值化处理及算法比对实例解析
2020/06/19 Python
复古风格的女装和装饰品:ModCloth
2017/12/29 全球购物
Expedia印度尼西亚站:预订酒店、廉价航班和度假套餐
2018/01/31 全球购物
广州品高软件.net笔面试题目
2012/04/18 面试题
初中生期末考试的自我评价
2013/12/17 职场文书
教师产假请假条范文
2014/04/10 职场文书
中学生运动会口号
2014/06/07 职场文书
建筑工地质量标语
2014/06/12 职场文书
大一新生期末自我评价
2014/09/12 职场文书
员工工作及收入证明
2014/10/28 职场文书
python 实现德洛内三角剖分的操作
2021/04/22 Python
MySQL七种JOIN类型小结
2021/10/24 MySQL
使用 CSS 构建强大且酷炫的粒子动画效果
2022/08/14 HTML / CSS