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查找第k小元素代码分享
Dec 18 Python
python django集成cas验证系统
Jul 14 Python
初步剖析C语言编程中的结构体
Jan 16 Python
Pandas标记删除重复记录的方法
Apr 08 Python
Django2.1集成xadmin管理后台所遇到的错误集锦(填坑)
Dec 20 Python
通过python爬虫赚钱的方法
Jan 29 Python
python把1变成01的步骤总结
Feb 27 Python
基于python实现从尾到头打印链表
Nov 02 Python
tensorflow实现二维平面模拟三维数据教程
Feb 11 Python
Django调用支付宝接口代码实例详解
Apr 04 Python
python中os.remove()用法及注意事项
Jan 31 Python
pytorch中的 .view()函数的用法介绍
Mar 17 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
SONY ICF-SW07收音机电路分析
2021/03/02 无线电
JS实现打开本地文件或文件夹
2021/03/09 Javascript
javascript延时重复执行函数 lLoopRun.js
2007/06/29 Javascript
JQuery防止退格键网页后退的实现代码
2012/03/23 Javascript
JS自动缩小超出大小的图片
2012/10/12 Javascript
js 限制input只能输入数字、字母和汉字等等
2013/12/18 Javascript
jQuery中detach()方法用法实例
2014/12/25 Javascript
JavaScript子窗口调用父窗口变量和函数的方法
2015/10/09 Javascript
JavaScript排序算法动画演示效果的实现方法
2016/10/18 Javascript
ES6概念 Symbol toString()方法
2016/12/25 Javascript
javaScript中封装的各种写法示例(推荐)
2017/07/03 Javascript
js Dom实现换肤效果
2017/10/21 Javascript
记一次webpack3升级webpack4的踩坑经历
2018/06/12 Javascript
微信小程序自定义头部导航栏和导航栏背景图片 navigationStyle问题
2019/07/26 Javascript
WEEX环境搭建与入门详解
2019/10/16 Javascript
go语言计算两个时间的时间差方法
2015/03/13 Python
Python列表和元组的定义与使用操作示例
2017/07/26 Python
Python内置模块turtle绘图详解
2017/12/09 Python
python编程实现随机生成多个椭圆实例代码
2018/01/03 Python
使用Numpy读取CSV文件,并进行行列删除的操作方法
2018/07/04 Python
在IPython中执行Python程序文件的示例
2018/11/01 Python
使用Python获取网段IP个数以及地址清单的方法
2018/11/01 Python
我们为什么要减少Python中循环的使用
2019/07/10 Python
使用Python为中秋节绘制一块美味的月饼
2019/09/11 Python
Python 矩阵转置的几种方法小结
2019/12/02 Python
Python如何使用内置库matplotlib绘制折线图
2020/02/24 Python
浅析Python 条件控制语句
2020/07/15 Python
python3中布局背景颜色代码分析
2020/12/01 Python
python学习之使用Matplotlib画实时的动态折线图的示例代码
2021/02/25 Python
经典的班主任推荐信
2013/10/28 职场文书
开学典礼感言
2014/02/16 职场文书
结婚保证书范文
2014/04/29 职场文书
团支部组织委员竞选稿
2015/11/21 职场文书
人生感悟经典句子
2019/08/20 职场文书
MATLAB 如何求取离散点的曲率最大值
2021/04/16 Python
NoSQL优缺点与MongoDB数据库简介
2022/06/05 MongoDB