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 相关文章推荐
10种检测Python程序运行时间、CPU和内存占用的方法
Apr 01 Python
Python的Django框架中消息通知的计数器实现教程
Jun 13 Python
python机器学习理论与实战(四)逻辑回归
Jan 19 Python
Python实现按中文排序的方法示例
Apr 25 Python
python使用response.read()接收json数据的实例
Dec 19 Python
Python 判断图像是否读取成功的方法
Jan 26 Python
python SQLAlchemy 中的Engine详解
Jul 04 Python
Python对列表的操作知识点详解
Aug 20 Python
屏蔽Django admin界面添加按钮的操作
Mar 11 Python
Python如何使用paramiko模块连接linux
Mar 18 Python
python实现测试工具(一)——命令行发送get请求
Oct 19 Python
python 算法题——快乐数的多种解法
May 27 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
4.与数据库的连接
2006/10/09 PHP
dedecms防止FCK乱格式化你的代码的修改方法
2007/03/17 PHP
PHP 开源AJAX框架14种
2009/08/24 PHP
php 判断是否是中文/英文/数字示例代码
2013/09/30 PHP
PHP中使用sleep函数实现定时任务实例分享
2014/08/21 PHP
ThinkPHP中URL路径访问与模块控制器之间的关系
2014/08/23 PHP
Laravel 自定命令以及生成文件的例子
2019/10/23 PHP
javascript学习(二)javascript常见问题总结
2013/01/02 Javascript
JS和函数式语言的三特性
2014/03/05 Javascript
jquery实现鼠标滑过后动态图片提示效果实例
2015/08/10 Javascript
EasyUI闪屏EasyUI页面加载提示(原理+代码+效果图)
2016/02/21 Javascript
AngularJS基础 ng-paste 指令简单示例
2016/08/02 Javascript
浅析使用BootStrap TreeView插件实现灵活配置快递模板
2016/11/28 Javascript
vue实现表格过滤功能
2019/09/27 Javascript
antd-DatePicker组件获取时间值,及相关设置方式
2020/10/27 Javascript
Python中使用插入排序算法的简单分析与代码示例
2016/05/04 Python
简单谈谈Python中的元祖(Tuple)和字典(Dict)
2017/04/21 Python
Python的语言类型(详解)
2017/06/24 Python
python中将字典形式的数据循环插入Excel
2018/01/16 Python
Python动态导入模块的方法实例分析
2018/06/28 Python
基于数据归一化以及Python实现方式
2018/07/11 Python
Python使用get_text()方法从大段html中提取文本的实例
2019/08/27 Python
PyCharm如何导入python项目的方法
2020/02/06 Python
numpy的Fancy Indexing和array比较详解
2020/06/11 Python
使用TensorBoard进行超参数优化的实现
2020/07/06 Python
matplotlib部件之套索Lasso的使用
2021/02/24 Python
英国领先的维生素和补充剂品牌:Higher Nature
2019/08/26 全球购物
Dodax奥地利:音乐、电影、书籍、玩具、电子产品等
2019/08/31 全球购物
这段代码难道不该打印出56吗
2013/02/27 面试题
盛大笔试题
2016/11/05 面试题
电大毕业生自我鉴定
2013/11/10 职场文书
大学生军训广播稿
2014/01/24 职场文书
大学辅导员事迹材料
2014/02/05 职场文书
优秀实习生感言
2014/03/01 职场文书
目标责任书范文
2014/04/14 职场文书
一条慢SQL语句引发的改造之路
2022/03/16 MySQL