Python解决八皇后问题示例


Posted in Python onApril 22, 2018

本文实例讲述了Python解决八皇后问题的方法。分享给大家供大家参考,具体如下:

八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n1×n1,而皇后个数也变成n2。而且仅当 n2 = 1 或 n1 ≥ 3 时问题有解。

这是一个典型的回溯算法,我们可以将问题进行分解:

首先,我们要想到某种方法来解决冲突检测问题,即不能令棋子处于能相互吃掉的位置——相邻、左右对角线。

其次,运用回溯的方法,求得问题的解。此处具体为函数的递归调用,当调用到棋盘的最后一行,便跳出,求得解。

最后,将我们的解打印出来。难点在于对递归调用函数的理解。

这仅仅是思路,是我们必须要解决的问题,但并不代表程序的运行流程。

具体代码如下:

#-*- coding:utf-8 -*-
import random
#冲突检查,在定义state时,采用state来标志每个皇后的位置,其中索引用来表示横坐标,基对应的值表示纵坐标,例如: state[0]=3,表示该皇后位于第1行的第4列上
def conflict(state, nextX):
  nextY = len(state)
#  print(nextY),
  for i in range(nextY):
    #如果下一个皇后的位置与当前的皇后位置相邻(包括上下,左右)或在同一对角线上,则说明有冲突,需要重新摆放
    if abs(state[i]-nextX) in (0, nextY-i):
#纵坐标减去下一个皇后的横坐标的绝对值 处于 0到下一皇后纵坐标减i则冲突
      return True
  return False
#采用生成器的方式来产生每一个皇后的位置,并用递归来实现下一个皇后的位置。
def queens(num, state=()):
  #num = 8
#  print("%d "%len(state)),
  for pos in range(num):
    if not conflict(state, pos): #如果没有冲突
      #产生当前皇后的位置信息
      if len(state) == num-1:
        yield (pos, ) #生成元组
      #否则,把当前皇后的位置信息,添加到状态列表里,并传递给下一皇后。
      else:
        for result in queens(num, state+(pos,)):
          yield (pos, ) + result
          #result这个变量代表的是quees返回的元组
#若是最后一行 对于 pos in range(num)调用conflict(state, num) ,
#如果没有冲突,生成元组
#若不是最后一行 对于pos in range(num)调用conflict(state, pos),
#如果没有冲突,state更新,递归调用queens(num, state) state将更新
#为了直观表现棋盘,用X表示每个皇后的位置
def prettyprint(solution):
  def line(pos, length=len(solution)):
    return '. ' * (pos) + 'X ' + '. '*(length-pos-1)
  for pos in solution:
    print line(pos)
if __name__ == "__main__":#来判断是否是在直接运行该.py文件
  prettyprint(random.choice(list(queens(8))))

运行结果:

Python解决八皇后问题示例

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python的类变量和成员变量用法实例教程
Aug 25 Python
wxPython的安装图文教程(Windows)
Dec 28 Python
Appium+python自动化之连接模拟器并启动淘宝APP(超详解)
Jun 17 Python
浅谈PyQt5 的帮助文档查找方法,可以查看每个类的方法
Jun 25 Python
tensorflow实现打印ckpt模型保存下的变量名称及变量值
Jan 04 Python
python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解
Feb 11 Python
Python3 操作 MySQL 插入一条数据并返回主键 id的实例
Mar 02 Python
keras自定义损失函数并且模型加载的写法介绍
Jun 15 Python
Pytorch损失函数nn.NLLLoss2d()用法说明
Jul 07 Python
如何利用python之wxpy模块玩转微信
Aug 17 Python
90行Python代码开发个人云盘应用
Apr 20 Python
 分享一个Python 遇到数据库超好用的模块
Apr 06 Python
Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法
Apr 22 #Python
对python中raw_input()和input()的用法详解
Apr 22 #Python
对Python3中的input函数详解
Apr 22 #Python
Python实现中一次读取多个值的方法
Apr 22 #Python
使用python编写udp协议的ping程序方法
Apr 22 #Python
python 实现判断ip连通性的方法总结
Apr 22 #Python
Python数据结构之哈夫曼树定义与使用方法示例
Apr 22 #Python
You might like
Windows下的PHP5.0详解
2006/11/18 PHP
一个PHP验证码类代码分享(已封装成类)
2011/07/17 PHP
php微信公众平台配置接口开发程序
2016/09/22 PHP
解密效果
2006/06/23 Javascript
JavaScript与C# Windows应用程序交互方法
2007/06/29 Javascript
javascript dom 操作详解 js加强
2009/07/13 Javascript
JQUERY设置IFRAME的SRC值的代码
2010/11/30 Javascript
JavaScript字符串String和Array操作的有趣方法
2012/12/18 Javascript
jQuery中detach()方法用法实例
2014/12/25 Javascript
jQuery中:gt选择器用法实例
2014/12/29 Javascript
jqGrid用法汇总(全经典)
2016/06/28 Javascript
js时间比较 js计算时间差的简单实现方法
2016/08/26 Javascript
javascript表单正则应用
2017/02/04 Javascript
js实现拖拽功能
2017/03/01 Javascript
H5基于iScroll实现下拉刷新和上拉加载更多
2017/07/18 Javascript
vue+socket.io+express+mongodb 实现简易多房间在线群聊示例
2017/10/21 Javascript
AngularJS实现图片上传和预览功能的方法分析
2017/11/08 Javascript
Vue自定义弹窗指令的实现代码
2018/08/13 Javascript
jsonp跨域及实现百度首页联想功能的方法
2018/08/30 Javascript
[00:36]DOTA2上海特级锦标赛 Archon战队宣传片
2016/03/04 DOTA
python局部赋值的规则
2013/03/07 Python
Python PyQt5实现的简易计算器功能示例
2017/08/23 Python
python实现将一个数组逆序输出的方法
2018/06/25 Python
Kali Linux安装ipython2 和 ipython3的方法
2019/07/11 Python
利用Python实现手机短信监控通知的方法
2019/07/22 Python
Python turtle画图库&&画姓名实例
2020/01/19 Python
Python利用逻辑回归分类实现模板
2020/02/15 Python
浅谈python中频繁的print到底能浪费多长时间
2020/02/21 Python
HTML5如何为形状图上颜色怎么绘制具有颜色和透明度的矩形
2014/06/23 HTML / CSS
大学生素质拓展活动方案
2014/02/11 职场文书
幼儿园中班教师寄语
2014/04/03 职场文书
《风娃娃》教学反思
2014/04/19 职场文书
24句精辟的现实社会语录,句句扎心,道尽人性
2019/08/29 职场文书
《初涉尘世》读后感3篇
2020/01/10 职场文书
CSS变量实现主题切换的方法
2021/06/23 HTML / CSS
vue修饰符.capture和.self的区别
2022/04/22 Vue.js