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编码类型转换方法详解
Jul 01 Python
Python爬虫爬取美剧网站的实现代码
Sep 03 Python
python 采集中文乱码问题的完美解决方法
Sep 27 Python
python下解压缩zip文件并删除文件的实例
Apr 24 Python
Python实现的排列组合、破解密码算法示例
Apr 12 Python
Python requests设置代理的方法步骤
Feb 23 Python
详解pandas中iloc, loc和ix的区别和联系
Mar 09 Python
Python 给下载文件显示进度条和下载时间的实现
Apr 02 Python
一篇文章带你搞懂Python类的相关知识
May 20 Python
怎么用Python识别手势数字
Jun 07 Python
如何用六步教会你使用python爬虫爬取数据
Apr 06 Python
Python列表的索引与切片
Apr 07 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/12/11 PHP
做了CDN获取用户真实IP的函数代码(PHP与Asp设置方式)
2013/04/13 PHP
php实现微信公众平台账号自定义菜单类
2015/10/11 PHP
学习php设计模式 php实现装饰器模式(decorator)
2015/12/07 PHP
PHP从二维数组得到N层分类树的实现代码
2016/10/11 PHP
解决form中action属性后面?传递参数 获取不到的问题
2017/07/21 PHP
VSCode+PHPstudy配置PHP开发环境的步骤详解
2020/08/20 PHP
js png图片(有含有透明)在IE6中为什么不透明了
2010/02/07 Javascript
js 处理URL实用技巧
2010/11/23 Javascript
JS方法调用括号的问题探讨
2014/01/24 Javascript
探讨JavaScript标签位置的存放与功能有无关系
2016/01/15 Javascript
纯js和css完成贪吃蛇小游戏demo
2016/09/01 Javascript
JavaScript实现获取远程的html到当前页面中
2017/03/26 Javascript
JS中关于正则的巧妙操作
2017/08/31 Javascript
vue中typescript装饰器的使用方法超实用教程
2019/06/17 Javascript
基于JS实现父组件的请求服务过程解析
2019/10/14 Javascript
NodeJS http模块用法示例【创建web服务器/客户端】
2019/11/05 NodeJs
解决Nuxt使用axios跨域问题
2020/07/06 Javascript
python实现分析apache和nginx日志文件并输出访客ip列表的方法
2015/04/04 Python
Python 读写文件和file对象的方法(推荐)
2016/09/12 Python
Python2和Python3中print的用法示例总结
2017/10/25 Python
python实现贪吃蛇小游戏
2020/03/21 Python
基于Python的ModbusTCP客户端实现详解
2019/07/13 Python
利用ImageAI库只需几行python代码实现目标检测
2019/08/09 Python
Python2与Python3的区别详解
2020/02/09 Python
python打开音乐文件的实例方法
2020/07/21 Python
3种方式实现瀑布流布局小结
2019/09/05 HTML / CSS
美术国培研修感言
2014/02/12 职场文书
成绩单家长评语大全
2014/04/16 职场文书
团结就是力量演讲稿
2014/05/21 职场文书
2014年维修工作总结
2014/11/22 职场文书
2015社区健康教育工作总结
2015/05/20 职场文书
导游词之云南-元阳梯田
2019/10/08 职场文书
详解Laravel框架的依赖注入功能
2021/05/27 PHP
MySQL 主从复制数据不一致的解决方法
2022/03/18 MySQL
Vscode中SSH插件如何远程连接Linux
2022/05/02 Servers