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中使用cookielib和urllib2配合PyQuery抓取网页信息
Apr 25 Python
浅析Python中return和finally共同挖的坑
Aug 18 Python
Python数据分析之双色球中蓝红球分析统计示例
Feb 03 Python
基于Python Numpy的数组array和矩阵matrix详解
Apr 04 Python
pyqt5 实现在别的窗口弹出进度条
Jun 18 Python
python 读写excel文件操作示例【附源码下载】
Jun 19 Python
浅析Python 中几种字符串格式化方法及其比较
Jul 02 Python
python爬虫 Pyppeteer使用方法解析
Sep 28 Python
python飞机大战pygame碰撞检测实现方法分析
Dec 17 Python
python利用百度云接口实现车牌识别的示例
Feb 21 Python
Python的PIL库中getpixel方法的使用
Apr 09 Python
scrapy与selenium结合爬取数据(爬取动态网站)的示例代码
Sep 28 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 文件上传模型,支持多文件上传
2009/08/13 PHP
php in_array() 检查数组中是否存在某个值详解
2016/11/23 PHP
php将html转为图片的实现方法
2017/05/19 PHP
Laravel中如何轻松容易的输出完整的SQL语句
2020/07/26 PHP
javascript String 的扩展方法集合
2008/06/01 Javascript
Jquery 动态添加按钮实现代码
2010/05/06 Javascript
javascript innerHTML使用分析
2010/12/03 Javascript
中国地区三级联动下拉菜单效果分析
2012/11/15 Javascript
js获取元素相对窗口位置的实现代码
2014/09/28 Javascript
jquery使用each方法遍历json格式数据实例
2015/05/18 Javascript
JavaScript判断undefined类型的正确方法
2015/06/30 Javascript
jQuery实现点击水纹波动动画
2016/04/10 Javascript
jquery遍历标签中自定义的属性方法
2016/09/17 Javascript
nodejs前端自动化构建环境的搭建
2017/07/26 NodeJs
原生js实现简单的模态框示例
2017/09/08 Javascript
JS使用遮罩实现点击某区域以外时弹窗的弹出与关闭功能示例
2018/07/31 Javascript
javascript canvas检测小球碰撞
2020/04/17 Javascript
Vue elementui字体图标显示问题解决方案
2020/08/18 Javascript
vue实现简易的双向数据绑定
2020/12/29 Vue.js
JavaScript中clientWidth,offsetWidth,scrollWidth的区别
2021/01/25 Javascript
Python实现给文件添加内容及得到文件信息的方法
2015/05/28 Python
简析Python的闭包和装饰器
2016/02/26 Python
Python如何获取系统iops示例代码
2016/09/06 Python
Win7 64位下python3.6.5安装配置图文教程
2020/10/27 Python
[原创]windows下Anaconda的安装与配置正解(Anaconda入门教程)
2018/04/05 Python
numpy判断数值类型、过滤出数值型数据的方法
2018/06/09 Python
python format 格式化输出方法
2018/07/16 Python
python多进程实现文件下载传输功能
2018/07/28 Python
python爬虫获取百度首页内容教学
2018/12/23 Python
Janie and Jack美国官网:GAP旗下的高档童装品牌
2019/09/09 全球购物
戴森西班牙官网:Dyson西班牙
2020/02/04 全球购物
求职简历自我评价范例
2014/03/12 职场文书
真诚的求职信
2014/07/04 职场文书
乡镇组织委员个人整改措施
2014/09/16 职场文书
《金色的草地》教学反思
2016/02/17 职场文书
2019年恭贺升学祝福语集锦
2019/08/15 职场文书