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脚本实现下载合并SAE日志
Feb 10 Python
python使用正则表达式的search()函数实现指定位置搜索功能
Nov 10 Python
python线程池(threadpool)模块使用笔记详解
Nov 17 Python
对python 矩阵转置transpose的实例讲解
Apr 17 Python
python实现音乐下载的统计
Jun 20 Python
Python批处理删除和重命名文件夹的实例
Jul 11 Python
对Python 语音识别框架详解
Dec 24 Python
Python的高阶函数用法实例分析
Apr 11 Python
python实现月食效果实例代码
Jun 18 Python
网易2016研发工程师编程题 奖学金(python)
Jun 19 Python
python给图像加上mask,并提取mask区域实例
Jan 19 Python
pytorch实现手写数字图片识别
May 20 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读取数据库信息的几种方法
2008/05/24 PHP
php email邮箱正则
2008/10/08 PHP
PHP中查询SQL Server或Sybase时TEXT字段被截断的解决方法
2009/03/10 PHP
php采用curl实现伪造IP来源的方法
2014/11/21 PHP
php实现俄罗斯乘法实例
2015/03/07 PHP
PHP简单实现二维数组的矩阵转置操作示例
2017/11/24 PHP
改版了网上的一个js操作userdata
2007/04/27 Javascript
javascript flash下fromCharCode和charCodeAt方法使用说明
2008/01/12 Javascript
jquery实现的超出屏幕时把固定层变为定位层的代码
2010/02/23 Javascript
Js 时间间隔计算的函数(间隔天数)
2011/11/15 Javascript
Javascript 判断是否存在函数的方法
2013/01/03 Javascript
批量实现面向对象的实例代码
2013/07/01 Javascript
获取下拉列表框的值是数组,split,$.inArray示例
2013/11/13 Javascript
node.js正则表达式获取网页中所有链接的代码实例
2014/06/03 Javascript
JS实现一个列表中包含上移下移删除等功能
2014/09/24 Javascript
如何在MVC应用程序中使用Jquery
2014/11/17 Javascript
jquery实现自适应banner焦点图
2017/02/16 Javascript
基于JavaScript实现选项卡效果
2017/07/21 Javascript
微信小程序授权获取用户详细信息openid的实例详解
2017/09/20 Javascript
基于vue cli 通过命令行传参实现多环境配置
2018/07/12 Javascript
原来JS还可以这样拆箱转换详解
2019/02/01 Javascript
在vue中使用image-webpack-loader实例
2020/11/12 Javascript
详解Python中的正则表达式
2018/07/08 Python
Python实现的读取/更改/写入xml文件操作示例
2018/08/30 Python
python 3调用百度OCR API实现剪贴板文字识别
2018/09/04 Python
python利用7z批量解压rar的实现
2019/08/07 Python
Python 格式化输出_String Formatting_控制小数点位数的实例详解
2020/02/04 Python
解决Python中报错TypeError: must be str, not bytes问题
2020/04/07 Python
C#里面可以避免一个类被其他类继承么?如何?
2013/09/26 面试题
工程造价管理专业大专生求职信
2013/10/06 职场文书
表彰先进集体通报
2014/01/12 职场文书
接待员岗位责任制
2014/02/10 职场文书
个人思想政治总结
2015/03/05 职场文书
大学生读书笔记范文
2015/07/01 职场文书
新教师2015年度工作总结
2015/07/22 职场文书
python爬虫请求库httpx和parsel解析库的使用测评
2021/05/10 Python