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 MD5文件生成码
Jan 12 Python
零基础写python爬虫之HTTP异常处理
Nov 05 Python
Python实现模拟分割大文件及多线程处理的方法
Oct 10 Python
django开发教程之利用缓存文件进行页面缓存的方法
Nov 10 Python
Python json模块dumps、loads操作示例
Sep 06 Python
Python3.5实现的罗马数字转换成整数功能示例
Feb 25 Python
Python一个简单的通信程序(客户端 服务器)
Mar 06 Python
Python如何使用k-means方法将列表中相似的句子归类
Aug 08 Python
python集合的创建、添加及删除操作示例
Oct 08 Python
Pyqt5自适应布局实例
Dec 13 Python
DataFrame 数据合并实现(merge,join,concat)
Jun 14 Python
python获取天气接口给指定微信好友发天气预报
Dec 28 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+Html+缓存
2006/12/20 PHP
php下实现伪 url 的超简单方法[转]
2007/09/24 PHP
mysql 性能的检查和优化方法
2009/06/21 PHP
PHP生成网页快照 不用COM不用扩展.
2010/02/11 PHP
PHP编程实现多维数组按照某个键值排序的方法小结【2种方法】
2017/04/27 PHP
PHP实现的登录页面信息提示功能示例
2017/07/24 PHP
jquery实现的超出屏幕时把固定层变为定位层的代码
2010/02/23 Javascript
将HTML的左右尖括号等转义成实体形式的两种实现方式
2014/05/04 Javascript
JS小游戏之仙剑翻牌源码详解
2014/09/25 Javascript
JavaScript的类型、值和变量小结
2015/07/09 Javascript
jQuery实现文本框邮箱输入自动补全效果
2015/11/17 Javascript
浅析JavaScript声明变量
2015/12/21 Javascript
AngularJS单选框及多选框实现双向动态绑定
2016/01/13 Javascript
简单实现的JQuery文本框水印插件
2016/06/14 Javascript
针对BootStrap中tabs控件的美化和完善(推荐)
2016/07/06 Javascript
轻松5句话解决JavaScript的作用域
2016/07/15 Javascript
JS控制HTML元素的显示和隐藏的两种方法
2016/09/27 Javascript
如何快速解决JS或Jquery ajax异步跨域的问题
2018/01/08 jQuery
vue实现Excel文件的上传与下载功能的两种方式
2019/06/28 Javascript
python轻松实现代码编码格式转换
2015/03/26 Python
解决python os.mkdir创建目录失败的问题
2018/10/16 Python
Python实现的合并两个有序数组算法示例
2019/03/04 Python
python tools实现视频的每一帧提取并保存
2020/03/20 Python
python实现ip代理池功能示例
2019/07/05 Python
python使用paramiko模块通过ssh2协议对交换机进行配置的方法
2019/07/25 Python
李宁官方网店:中国运动品牌
2017/11/02 全球购物
编辑求职信样本
2013/12/16 职场文书
网上开商店的创业计划书
2014/01/19 职场文书
致全体运动员广播稿
2014/02/01 职场文书
数控专业个人求职信范文
2014/02/05 职场文书
招商专员岗位职责
2014/02/08 职场文书
银行招聘自荐信
2015/03/06 职场文书
2015年检验科工作总结
2015/04/27 职场文书
关于空气污染危害的感想
2015/08/11 职场文书
2016年大学生实习单位评语
2015/12/01 职场文书
2019奶茶店创业计划书范本!
2019/07/15 职场文书