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中列表、字典、元组、集合数据结构整理
Nov 20 Python
用Python实现一个简单的多线程TCP服务器的教程
May 05 Python
Python备份目录及目录下的全部内容的实现方法
Jun 12 Python
Python中的字符串替换操作示例
Jun 27 Python
Python3实现发送QQ邮件功能(附件)
Dec 23 Python
Scrapy基于selenium结合爬取淘宝的实例讲解
Jun 13 Python
在pycharm中设置显示行数的方法
Jan 16 Python
python pandas cumsum求累计次数的用法
Jul 29 Python
Python如何应用cx_Oracle获取oracle中的clob字段问题
Aug 27 Python
python 生成任意形状的凸包图代码
Apr 16 Python
Win10下配置tensorflow-gpu的详细教程(无VS2015/2017)
Jul 14 Python
python中的对数log函数表示及用法
Dec 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
php读取纯真ip数据库使用示例
2014/01/26 PHP
PIGCMS 如何关闭聊天机器人
2015/02/12 PHP
yii2分页之实现跳转到具体某页的实例代码
2016/06/02 PHP
PHP安装GeoIP扩展根据IP获取地理位置及计算距离的方法
2016/07/01 PHP
THINKPHP5.1 Config的配置与获取详解
2020/06/08 PHP
html a标签-超链接中confirm方法使用介绍
2013/01/04 Javascript
纯文字版返回顶端的js代码
2013/08/01 Javascript
Javascript毫秒数用法实例
2015/02/05 Javascript
深入解析JavaScript框架Backbone.js中的事件机制
2016/02/14 Javascript
妙用Angularjs实现表格按指定列排序
2017/06/23 Javascript
使用AngularJS编写多选按钮选中时触发指定方法的指令代码详解
2017/07/24 Javascript
浅谈JavaScript中的属性:如何遍历属性
2017/09/14 Javascript
vue组件详解之使用slot分发内容
2018/04/09 Javascript
NodeJs项目中关闭ESLint的方法
2018/08/09 NodeJs
layui实现form表单同时提交数据和文件的代码
2019/10/25 Javascript
[33:19]完美世界DOTA2联赛PWL S2 PXG vs InkIce 第一场 11.26
2020/11/30 DOTA
Python Mysql自动备份脚本
2008/07/14 Python
python内存管理分析
2015/04/08 Python
用python做一个搜索引擎(Pylucene)的实例代码
2017/07/05 Python
python处理csv数据动态显示曲线实例代码
2018/01/23 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
2019/01/03 Python
Python基于plotly模块实现的画图操作示例
2019/01/23 Python
利用ImageAI库只需几行python代码实现目标检测
2019/08/09 Python
python PIL/cv2/base64相互转换实例
2020/01/09 Python
python实现启动一个外部程序,并且不阻塞当前进程
2020/12/05 Python
CSS3动画animation实现云彩向左滚动
2014/05/09 HTML / CSS
享誉全球的多元化时尚精品购物平台:Farfetch发发奇(支持中文)
2017/08/08 全球购物
Sasa莎莎海外旗舰店:香港莎莎美妆平台
2018/03/21 全球购物
Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
2012/05/30 面试题
普通大学毕业生自荐信范文
2014/02/23 职场文书
公务员个人考察材料
2014/12/23 职场文书
聋哑人盗窃罪辩护词
2015/05/21 职场文书
《玩出了名堂》教学反思
2016/02/17 职场文书
python 调用js的四种方式
2021/04/11 Python
JavaWeb 入门篇:创建Web项目,Idea配置tomcat
2021/07/16 Java/Android
Elasticsearch 批量操作
2022/04/19 Python