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获取电脑硬件信息及状态的实现方法
Aug 29 Python
Python中不同进制互相转换(二进制、八进制、十进制和十六进制)
Apr 05 Python
python 调用HBase的简单实例
Dec 18 Python
详解python中executemany和序列的使用方法
Aug 12 Python
python数据结构之列表和元组的详解
Sep 23 Python
python 对dataframe下面的值进行大规模赋值方法
Jun 09 Python
Python 矩阵转置的几种方法小结
Dec 02 Python
简单了解Python write writelines区别
Feb 27 Python
keras的siamese(孪生网络)实现案例
Jun 12 Python
python里的单引号和双引号的有什么作用
Jun 17 Python
Python3爬虫中关于中文分词的详解
Jul 29 Python
解决hive中导入text文件遇到的坑
Apr 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
生成缩略图
2006/10/09 PHP
PHP4实际应用经验篇(7)
2006/10/09 PHP
PHP开发入门教程之面向对象
2006/12/05 PHP
菜鸟学PHP之Smarty入门
2007/01/04 PHP
php面向对象全攻略 (二) 实例化对象 使用对象成员
2009/09/30 PHP
PHP5中使用PDO连接数据库的方法
2010/08/01 PHP
php正则表达式获取内容所有链接
2015/07/24 PHP
php用户登录之cookie信息安全分析
2016/05/13 PHP
Thinkphp结合ajaxFileUpload实现异步图片传输示例
2017/03/13 PHP
如何通过View::first使用Laravel Blade的动态模板详解
2017/09/21 PHP
List the UTC Time on a Computer
2007/06/11 Javascript
javascript编码的几个方法详细介绍
2013/01/06 Javascript
jquery validate在ie8下的bug解决方法
2013/11/13 Javascript
javaScript 计算两个日期的天数相差(示例代码)
2013/12/27 Javascript
jQuery动态添加与删除tr行实例代码
2016/10/18 Javascript
js 输入框 正则表达式(菜鸟必看教程)
2017/02/19 Javascript
AngularJS实现的省市二级联动功能示例【可对选项实现增删】
2017/10/26 Javascript
vue 自动化路由实现代码
2019/09/03 Javascript
JS中类的静态方法,静态变量,实例方法,实例变量区别与用法实例分析
2020/03/14 Javascript
[05:00]第二届DOTA2亚洲邀请赛主赛事第三天比赛集锦.mp4
2017/04/04 DOTA
Python对象转JSON字符串的方法
2016/04/27 Python
CentOS 7下Python 2.7升级至Python3.6.1的实战教程
2017/07/06 Python
Python实现快速傅里叶变换的方法(FFT)
2018/07/21 Python
美国在线鲜花速递:ProFlowers
2017/01/05 全球购物
土耳其国际性时尚购物网站:Modanisa
2018/01/19 全球购物
英国网上购买肉类网站:Great British Meat
2018/10/17 全球购物
中医专业应届生求职信
2013/11/17 职场文书
2014年寒假社会实践活动心得体会
2014/04/07 职场文书
婚前协议书
2014/04/15 职场文书
公司领导班子对照检查材料
2014/09/24 职场文书
师德师风自查总结
2014/10/14 职场文书
教师节大会主持词
2015/07/06 职场文书
晶体管来复再生式二管收音机
2021/04/22 无线电
详解Django的MVT设计模式
2021/04/29 Python
springboot拦截器无法注入redisTemplate的解决方法
2021/06/27 Java/Android
一篇文章带你学习Mybatis-Plus(新手入门)
2021/08/02 Java/Android