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遍历删除字典里值为空的元素报错问题
Sep 11 Python
详解Python list 与 NumPy.ndarry 切片之间的对比
Jul 24 Python
Python使用Matplotlib实现雨点图动画效果的方法
Dec 23 Python
python面向对象入门教程之从代码复用开始(一)
Dec 11 Python
python文件写入write()的操作
May 14 Python
python删除列表元素的三种方法(remove,pop,del)
Jul 22 Python
深入浅析Python科学计算库Scipy及安装步骤
Oct 12 Python
使用 Python 写一个简易的抽奖程序
Dec 08 Python
使用python实现数组、链表、队列、栈的方法
Dec 20 Python
Python While循环语句实例演示及原理解析
Jan 03 Python
TensorFlow设置日志级别的几种方式小结
Feb 04 Python
方法汇总:Python 安装第三方库常用
Apr 26 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的知识
2006/11/17 PHP
php生成SessionID和图片校验码的思路和实现代码
2009/03/10 PHP
PHP管理内存函数 memory_get_usage()使用介绍
2012/09/23 PHP
PHP中如何定义和使用常量
2013/02/28 PHP
学习YUI.Ext第七日-View&JSONView Part Two-一个画室网站的案例
2007/03/10 Javascript
JMenuTab简单使用说明
2008/03/13 Javascript
几个比较经典常用的jQuery小技巧
2010/03/01 Javascript
使用jQuery操作Cookies的实现代码
2011/10/09 Javascript
jQuery数据缓存功能的实现思路及简单模拟
2013/05/27 Javascript
JS获得URL超链接的参数值实例代码
2013/06/21 Javascript
同域jQuery(跨)iframe操作DOM(示例代码)
2013/12/13 Javascript
基于NodeJS的前后端分离的思考与实践(一)全栈式开发
2014/09/26 NodeJs
js实现获取两个日期之间所有日期的方法
2016/06/17 Javascript
全面解析Angular中$Apply()及$Digest()的区别
2016/08/04 Javascript
JS正则子匹配实例分析
2016/12/22 Javascript
微信小程序实现单列下拉菜单效果
2019/04/25 Javascript
Vue Components 数字键盘的实现
2019/09/18 Javascript
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
2021/01/22 Vue.js
Python中for循环详解
2014/01/17 Python
python中input()与raw_input()的区别分析
2016/02/27 Python
Python3.6正式版新特性预览
2016/12/15 Python
Python学习_几种存取xls/xlsx文件的方法总结
2018/05/03 Python
python对Excel按条件进行内容补充(推荐)
2019/11/24 Python
js实现移动端H5页面手指滑动刻度尺功能
2017/11/16 HTML / CSS
The Hut德国站点:时装、家居用品、美容等
2016/09/23 全球购物
GAP阿联酋官网:GAP UAE
2017/11/30 全球购物
工厂仓管员岗位职责
2014/01/01 职场文书
幼儿园小班教学反思
2014/02/02 职场文书
市场营销专业应届生自荐信
2014/06/19 职场文书
学党史心得体会
2014/09/05 职场文书
2014年实验室工作总结
2014/12/03 职场文书
KTV员工管理制度
2015/08/06 职场文书
2016形势与政策学习心得体会
2016/01/12 职场文书
2016年度师德标兵先进事迹材料
2016/02/26 职场文书
中秋节作文(五年级)之关于月亮
2019/09/11 职场文书
Python实现日志实时监测的示例详解
2022/04/06 Python