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获取android设备的GPS信息脚本分享
Mar 06 Python
Windows下实现Python2和Python3两个版共存的方法
Jun 12 Python
Python的Tornado框架实现图片上传及图片大小修改功能
Jun 30 Python
10个Python小技巧你值得拥有
Sep 29 Python
python学习之hook钩子的原理和使用
Oct 25 Python
Python常见数字运算操作实例小结
Mar 22 Python
Python实现的登录验证系统完整案例【基于搭建的MVC框架】
Apr 12 Python
django 使用全局搜索功能的实例详解
Jul 18 Python
Python 网络编程之TCP客户端/服务端功能示例【基于socket套接字】
Oct 12 Python
Python如何使用OS模块调用cmd
Feb 27 Python
基于Python的OCR实现示例
Apr 03 Python
使用python实现微信小程序自动签到功能
Apr 27 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
在PHP中使用redis
2013/11/04 PHP
PHP PDOStatement对象bindpram()、bindvalue()和bindcolumn之间的区别
2014/11/20 PHP
PHP实现简单数字分页效果
2015/07/26 PHP
安装PHP扩展时解压官方 tgz 文件后没有configure文件无法进行配置编译的问题
2020/08/26 PHP
JavaScript高级程序设计
2006/12/29 Javascript
extjs 学习笔记 四 带分页的grid
2009/10/20 Javascript
基于JQuery的浮动DIV显示提示信息并自动隐藏
2011/02/11 Javascript
JS的encodeURI和java的URLDecoder.decode使用介绍
2014/05/08 Javascript
JavaScript Array对象扩展indexOf()方法
2014/05/09 Javascript
javascript+HTML5的Canvas实现Lab单车动画效果
2015/08/07 Javascript
Vue2.0实现1.0的搜索过滤器功能实例代码
2017/03/20 Javascript
JS实现多张图片预览同步上传功能
2017/06/23 Javascript
Vue.js中extend选项和delimiters选项的比较
2017/07/17 Javascript
如何解决vue2.0下IE浏览器白屏问题
2018/09/13 Javascript
生产制造追溯系统之再说条码打印
2019/06/03 Javascript
layui table 表格上添加日期控件的两种方法
2019/09/28 Javascript
解决vue项目F5刷新mounted里的函数不执行问题
2019/11/05 Javascript
js获取本日、本周、本月的时间代码
2020/02/01 Javascript
使用React代码动态生成栅格布局的方法
2020/05/24 Javascript
[06:14]《辉夜杯》外卡赛附加赛 4支战队巡礼
2015/10/23 DOTA
[47:31]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第一场 12.12
2020/12/16 DOTA
python操作MongoDB基础知识
2013/11/01 Python
Python中turtle作图示例
2017/11/15 Python
python装饰器-限制函数调用次数的方法(10s调用一次)
2018/04/21 Python
Python3分析处理声音数据的例子
2019/08/27 Python
python自动化实现登录获取图片验证码功能
2019/11/20 Python
python实现名片管理器的示例代码
2019/12/17 Python
使用Python来做一个屏幕录制工具的操作代码
2020/01/18 Python
《临死前的严监生》教学反思
2014/02/13 职场文书
《山谷中的谜底》教学反思
2014/04/26 职场文书
投资建议书模板
2014/05/12 职场文书
集体生日活动方案
2014/08/18 职场文书
求职自我评价范文100字
2014/09/23 职场文书
网站出售协议书范文
2014/10/10 职场文书
node.js使用express-fileupload中间件实现文件上传
2021/07/16 Javascript
JavaScript的function函数详细介绍
2021/11/20 Javascript