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 相关文章推荐
Python3实现连接SQLite数据库的方法
Aug 23 Python
Python实现遍历数据库并获取key的值
May 17 Python
Python中的一些陷阱与技巧小结
Jul 10 Python
Python复制文件操作实例详解
Nov 10 Python
Python的爬虫包Beautiful Soup中用正则表达式来搜索
Jan 20 Python
Python3基于sax解析xml操作示例
May 22 Python
如何安装多版本python python2和python3共存以及pip共存
Sep 18 Python
Django模型中字段属性choice使用说明
Mar 30 Python
Python3实现个位数字和十位数字对调, 其乘积不变
May 03 Python
什么是python类属性
Jun 10 Python
Python unittest装饰器实现原理及代码
Sep 08 Python
pytorch 实现L2和L1正则化regularization的操作
Mar 03 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
jQuery 源码分析笔记
2011/05/25 PHP
php setcookie(name, value, expires, path, domain, secure) 参数详解
2013/06/28 PHP
PHP echo,print,printf,sprintf函数之间的区别与用法详解
2013/11/27 PHP
一个经典的PHP文件上传类分享
2014/11/18 PHP
PHP单例模式与工厂模式详解
2017/08/29 PHP
PHP如何防止XSS攻击与XSS攻击原理的讲解
2019/03/22 PHP
php依赖注入知识点详解
2019/09/23 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
JS实现匀速运动的代码实例
2013/11/29 Javascript
利用javascript打开模态对话框(示例代码)
2014/01/11 Javascript
JavaScript将取代AppleScript?
2014/09/18 Javascript
jQuery ajax MD5实现用户注册即时验证功能
2016/10/11 Javascript
详解前端构建工具gulpjs的使用介绍及技巧
2017/01/19 Javascript
微信小程序实战之仿android fragment可滑动底部导航栏(4)
2020/04/16 Javascript
Angular js 实现添加用户、修改密码、敏感字、下拉菜单的综合操作方法
2017/10/24 Javascript
vue-music关于Player播放器组件详解
2017/11/28 Javascript
Angular使用动态加载组件方法实现Dialog的示例
2018/05/11 Javascript
[53:10]Secret vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python抓取网页时字符集转换问题处理方案分享
2014/06/19 Python
Python数组遍历的简单实现方法小结
2016/04/27 Python
python SMTP实现发送带附件电子邮件
2018/05/22 Python
用什么库写 Python 命令行程序(示例代码详解)
2020/02/20 Python
Anaconda配置pytorch-gpu虚拟环境的图文教程
2020/04/16 Python
python库skimage给灰度图像染色的方法示例
2020/04/27 Python
python对接ihuyi实现短信验证码发送
2020/05/10 Python
基于Python实现简单学生管理系统
2020/07/24 Python
python使用matplotlib:subplot绘制多个子图的示例
2020/09/24 Python
Coach澳大利亚官方网站:美国著名时尚奢侈品牌
2017/05/24 全球购物
瑞士灯具购物网站:Lampenwelt.ch
2018/07/08 全球购物
LN-CC美国:伦敦时尚生活的缩影
2019/02/19 全球购物
StudentUniverse英国:学生航班、酒店和旅游
2019/08/25 全球购物
黑猩猩商店:The Chimp Store
2020/02/12 全球购物
巴西葡萄酒商店:Divvino
2020/02/22 全球购物
请用Java实现列出某个目录下的所有文件
2013/09/23 面试题
中学生学习生活的自我评价
2013/10/26 职场文书
2014年安全管理工作总结
2014/12/01 职场文书