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的math模块中的常用数学函数整理
Feb 04 Python
Python实现优先级队列结构的方法详解
Jun 02 Python
git使用.gitignore设置不生效或不起作用问题的解决方法
Jun 01 Python
Python实现调度算法代码详解
Dec 01 Python
Python实现二维数组输出为图片
Apr 03 Python
python3爬虫之设计签名小程序
Jun 19 Python
Python实现多线程/多进程的TCP服务器
Sep 03 Python
Python +Selenium解决图片验证码登录或注册问题(推荐)
Feb 09 Python
pandas中ix的使用详细讲解
Mar 09 Python
scrapy实践之翻页爬取的实现
Jan 05 Python
python实现语音常用度量方法的代码详解
May 25 Python
python模板入门教程之flask Jinja
Apr 11 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 Cookie的使用教程详解
2013/06/03 PHP
深入php常用函数的使用汇总
2013/06/08 PHP
淘宝ip地址查询类分享(利用淘宝ip库)
2014/01/07 PHP
php实现的网页版剪刀石头布游戏示例
2016/11/25 PHP
浅析javascript闭包 实例分析
2010/12/25 Javascript
jquery ajax传递中文参数乱码问题及解决方法说明
2014/02/07 Javascript
加随机数引入脚本不让浏览器读取缓存
2014/09/04 Javascript
浅谈nodeName,nodeValue,nodeType,typeof 的区别
2015/01/13 Javascript
深入理解JavaScript的React框架的原理
2015/07/02 Javascript
JavaScript编写带旋转+线条干扰的验证码脚本实例
2016/05/30 Javascript
动态统计当前输入内容的字节、字符数的实例详解
2017/10/27 Javascript
基于JavaScript中字符串的match与replace方法(详解)
2017/12/04 Javascript
vue 录制视频并压缩视频文件的方法
2018/07/27 Javascript
Vue-CLI3.x 设置反向代理的方法
2018/12/06 Javascript
深入理解基于vue-cli的webpack打包优化实践及探索
2019/10/14 Javascript
vue 开发企业微信整合案例分析
2019/12/02 Javascript
JavaScript 事件代理需要注意的地方
2020/09/08 Javascript
[01:27:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第一场 1月24日
2021/03/11 DOTA
Python程序语言快速上手教程
2012/07/18 Python
详解Python验证码识别
2016/01/25 Python
Python程序暂停的正常处理方法
2019/11/07 Python
Python如何使用BeautifulSoup爬取网页信息
2019/11/26 Python
Django框架反向解析操作详解
2019/11/28 Python
Python +Selenium解决图片验证码登录或注册问题(推荐)
2020/02/09 Python
python根据用户需求输入想爬取的内容及页数爬取图片方法详解
2020/08/03 Python
详解Scrapy Redis入门实战
2020/11/18 Python
分享CSS3中必须要知道的10个顶级命令
2012/04/26 HTML / CSS
Dr. Martens马汀博士官网:马丁靴始祖品牌
2016/10/15 全球购物
售后主管岗位职责
2013/12/08 职场文书
防灾减灾日活动总结
2014/08/26 职场文书
二手车转让协议书
2015/01/29 职场文书
公司开会通知
2015/04/20 职场文书
小学三年级作文之写景
2019/11/05 职场文书
MySQL update set 和 and的区别
2021/05/08 MySQL
mybatis 获取无数据的字段不显示的问题
2021/07/15 Java/Android
CKAD认证中部署k8s并配置Calico插件
2022/03/31 Servers