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 相关文章推荐
windows下python模拟鼠标点击和键盘输示例
Feb 28 Python
Python中用sleep()方法操作时间的教程
May 22 Python
在Linux下使用Python的matplotlib绘制数据图的教程
Jun 11 Python
Python 多线程的实例详解
Sep 07 Python
Python实现感知机(PLA)算法
Dec 20 Python
Numpy掩码式数组详解
Apr 17 Python
python的json中方法及jsonpath模块用法分析
Dec 06 Python
Python3如何使用tabulate打印数据
Sep 25 Python
Python爬虫中Selenium实现文件上传
Dec 04 Python
Python之qq自动发消息的示例代码
Feb 18 Python
教你如何用python开发一款数字推盘小游戏
Apr 14 Python
忆童年!用Python实现愤怒的小鸟游戏
Jun 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运行环境教程
2015/02/12 PHP
PHP实现分布式memcache设置web集群session同步的方法
2018/04/10 PHP
PHP文件打开关闭及读写操作示例解析
2020/08/06 PHP
多个iframe自动调整大小的问题
2006/09/18 Javascript
学习js所必须要知道的一些
2007/03/07 Javascript
jQuery使用手册之一
2007/03/24 Javascript
JavaScript设计模式之工厂方法模式介绍
2014/12/28 Javascript
JS实现控制表格内指定单元格内容对齐的方法
2015/03/30 Javascript
javascript基于DOM实现省市级联下拉框的方法
2015/05/14 Javascript
JavaScript面向对象之私有静态变量实例分析
2016/01/14 Javascript
JavaScript判断页面加载完之后再执行预定函数的技巧
2016/05/17 Javascript
用v-html解决Vue.js渲染中html标签不被解析的问题
2016/12/14 Javascript
细说webpack源码之compile流程-rules参数处理技巧(1)
2017/12/26 Javascript
小程序实现日历左右滑动效果
2019/10/21 Javascript
浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用
2020/03/08 Javascript
小程序按钮避免多次调用接口和点击方案实现(不用showLoading)
2020/04/15 Javascript
python3+PyQt5实现自定义窗口部件Counters
2018/04/20 Python
Python使用pyodbc访问数据库操作方法详解
2018/07/05 Python
python实现简单tftp(基于udp协议)
2018/07/30 Python
Python3爬虫学习入门教程
2018/12/11 Python
python编程进阶之异常处理用法实例分析
2020/02/21 Python
解决python和pycharm安装gmpy2 出现ERROR的问题
2020/08/28 Python
浅析Python 字符编码与文件处理
2020/09/24 Python
python定义具名元组实例操作
2021/02/28 Python
HTML5中的Web Notification桌面右下角通知功能的实现
2018/04/19 HTML / CSS
加拿大租车网站:Enterprise Rent-A-Car
2018/07/26 全球购物
SEPHORA丝芙兰捷克官网:购买香水、化妆品和护肤品
2018/11/26 全球购物
size?丹麦官网:英国伦敦的球鞋精品店
2019/04/15 全球购物
Tessabit美国:集世界奢侈品和设计师品牌的意大利精品买手店
2020/06/29 全球购物
Java中实现多态的机制
2015/08/09 面试题
为什么要做架构设计
2015/07/08 面试题
机械制造专业个人的自我评价
2013/12/28 职场文书
教师一岗双责责任书
2014/04/16 职场文书
校庆活动策划方案
2014/06/05 职场文书
2015年教学管理工作总结
2015/05/20 职场文书
2016年度创先争优活动总结
2016/04/05 职场文书