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 相关文章推荐
动态创建类实例代码
Oct 07 Python
利用pyinstaller或virtualenv将python程序打包详解
Mar 22 Python
解决Linux系统中python matplotlib画图的中文显示问题
Jun 15 Python
Python matplotlib画图与中文设置操作实例分析
Apr 23 Python
Python闭包和装饰器用法实例详解
May 22 Python
浅谈pytorch、cuda、python的版本对齐问题
Jan 15 Python
Python简单实现区域生长方式
Jan 16 Python
解决keras backend 越跑越慢问题
Jun 18 Python
sklearn和keras的数据切分与交叉验证的实例详解
Jun 19 Python
手把手教你配置JupyterLab 环境的实现
Feb 02 Python
python四种出行路线规划的实现
Jun 23 Python
Python使用openpyxl批量处理数据
Jun 23 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下escape解码函数的实现方法
2010/08/08 PHP
PHP 异步执行方法,模拟多线程的应用分析
2013/06/03 PHP
php项目中百度 UEditor 简单安装调试和调用
2015/07/15 PHP
PHP常见的几种攻击方式实例小结
2019/04/29 PHP
TP5框架实现上传多张图片的方法分析
2020/03/29 PHP
让iframe子窗体取父窗体地址栏参数(querystring)
2009/10/13 Javascript
jquery中ajax调用json数据的使用说明
2011/03/17 Javascript
jQuery实现的个性化返回底部与返回顶部特效代码
2015/10/30 Javascript
简单实现的JQuery文本框水印插件
2016/06/14 Javascript
原生JS+Canvas实现五子棋游戏
2020/05/28 Javascript
React+react-dropzone+node.js实现图片上传的示例代码
2017/08/23 Javascript
js链表操作(实例讲解)
2017/08/29 Javascript
React Native使用Modal自定义分享界面的示例代码
2017/10/31 Javascript
代码分析vue中如何配置less
2018/09/28 Javascript
使用vue2.6实现抖音【时间轮盘】屏保效果附源码
2019/04/24 Javascript
解决 viewer.js 动态更新图片导致无法预览的问题
2019/05/14 Javascript
Vue中keep-alive的两种应用方式
2020/07/15 Javascript
JS实现按比例缩小图片宽高
2020/08/24 Javascript
[50:28]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Newbee vs KG
2018/04/01 DOTA
Python使用pyshp库读取shapefile信息的方法
2018/12/29 Python
浅谈python str.format与制表符\t关于中文对齐的细节问题
2019/01/14 Python
python解析含有重复key的json方法
2019/01/22 Python
Python Django框架实现应用添加logging日志操作示例
2019/05/17 Python
python机器学习库scikit-learn:SVR的基本应用
2019/06/26 Python
python获取百度热榜链接的实例方法
2020/08/25 Python
Anaconda的安装与虚拟环境建立
2020/11/18 Python
彪马英国官网:PUMA英国
2019/02/11 全球购物
新西兰便宜隐形眼镜购买网站:QUICKLENS New Zealand
2019/03/02 全球购物
英国网上电器商店:Electricshop
2020/03/15 全球购物
应届优秀本科大学毕业生自我鉴定
2014/01/21 职场文书
投资合作协议书
2014/04/17 职场文书
清明节演讲稿
2014/05/27 职场文书
先进员工事迹材料
2014/12/20 职场文书
刑事上诉状(无罪)
2015/05/23 职场文书
小学英语教师研修感悟
2015/11/18 职场文书
python 机器学习的标准化、归一化、正则化、离散化和白化
2021/04/16 Python