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中的__init__、__new__和__call__方法
Jul 18 Python
python互斥锁、加锁、同步机制、异步通信知识总结
Feb 11 Python
pandas实现选取特定索引的行
Apr 20 Python
通过Python模块filecmp 对文件比较的实现方法
Jun 29 Python
python 使用sys.stdin和fileinput读入标准输入的方法
Oct 17 Python
pandas求两个表格不相交的集合方法
Dec 08 Python
python使用selenium实现批量文件下载
Mar 11 Python
Django集成CAS单点登录的方法示例
Jun 10 Python
Python编程学习之如何判断3个数的大小
Aug 07 Python
Python如何使用内置库matplotlib绘制折线图
Feb 24 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
Nov 18 Python
Python+SeaTable实现计算两个日期间的工作日天数
Jul 07 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
一个odbc连mssql分页的类
2006/10/09 PHP
一个PHP并发访问实例代码
2012/09/06 PHP
关于file_get_contents返回为空或函数不可用的解决方案
2013/06/24 PHP
PHP模拟QQ登录的方法
2015/07/29 PHP
分享PHP-pcntl 实现多进程代码
2016/09/30 PHP
php fseek函数读取大文件两种方法
2016/10/12 PHP
ThinkPHP中类的构造函数_construct()与_initialize()的区别详解
2017/03/13 PHP
Laravel5.* 打印出执行的sql语句的方法
2017/07/24 PHP
PHP实现的最大正向匹配算法示例
2017/12/19 PHP
做网页的一些技巧(续)
2007/02/01 Javascript
刷新页面实现方式总结(HTML,ASP,JS)
2008/11/13 Javascript
javascript 复杂的嵌套环境中输出单引号和双引号
2009/05/26 Javascript
setTimeout和setInterval的深入理解
2013/11/08 Javascript
jQuery实现获取table表格第一列值的方法
2016/03/01 Javascript
javascript实现简单的on事件绑定
2016/08/23 Javascript
Vue-Router实现页面正在加载特效方法示例
2017/02/12 Javascript
AugularJS从入门到实践(必看篇)
2017/07/10 Javascript
深入浅出理解JavaScript闭包的功能与用法
2018/08/01 Javascript
vue前后分离调起微信支付
2019/07/29 Javascript
vue解决跨域问题(推荐)
2020/11/10 Javascript
[35:29]Secret vs VG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
简单介绍Ruby中的CGI编程
2015/04/10 Python
python flask中静态文件的管理方法
2018/03/20 Python
python提取包含关键字的整行数据方法
2018/12/11 Python
python如何获取当前文件夹下所有文件名详解
2019/01/25 Python
python绘制评估优化算法性能的测试函数
2019/06/25 Python
Python模块相关知识点小结
2020/03/09 Python
Python collections模块的使用方法
2020/10/09 Python
瑞典快乐袜子:Happy Socks
2018/02/16 全球购物
举例说明类变量和实例变量的区别
2016/06/30 面试题
String、StringBuffer、StringBuilder有区别
2015/09/18 面试题
银行出纳岗位职责
2013/11/25 职场文书
趣味活动策划方案
2014/02/08 职场文书
农行心得体会
2014/09/02 职场文书
2014公司年终工作总结
2014/12/19 职场文书
Nginx反向代理学习实例教程
2021/10/24 Servers