Python八皇后问题解答过程详解


Posted in Python onJuly 29, 2019

最近看Python看得都不用tab键了,哈哈。今天看了一个经典问题--八皇后问题,说实话,以前学C、C++的时候有这个问题,但是当时不爱学,没搞会,后来算法课上又碰到,只是学会了思想,应该是学回溯法的时候碰到的。八皇后问题是说要在一个棋盘上放置8个皇后,但是不能发生战争,皇后们都小心眼,都爱争风吃醋,如果有人和自己在一条线上(水平、垂直、对角线)就会引发撕13大战,所以我们就是要妥当的安排8位娘娘,以保后宫太平。

言归正传,首先,我们得想好解决方案怎么表示,这种事首先想到列表,当然规模小的话用元组最好啦,列表都比较熟悉,这次试试元组。每个元组元素指定相应行皇后位置,如state[0] = 3表示第一行皇后在第4列。然后还要知道什么情况不行,就是说找到矛盾,我们定义一个函数:

def conflict(state,nextx):
 '定义冲突函数,state为元组,nextx为下一个皇后的水平位置,nexty为下一个皇后的垂直位置'
 nexty = len(state)
 for i in range(nexty):
  if abs(state[i]-nextx) in (0,nexty-i):#若下一个皇后和前面的皇后列相同或者在一条对角线上,则冲突
   return True
 return False

最后,我们要解决娘娘们的位置了,先找到一个不冲突的位置,如果这位娘娘是最后一位,那么我们就把娘娘们安排好了,返回该位置到解决方案;如果不是最后一位,也把该位置信息返回到状态元组(最后的解决方案是含全部位置信息的状态元组)并传给后面的皇后,看代码:

def queens(num=8,state=()):
 '八皇后问题,这里num表示规模'
 for pos in range(num):
  if not conflict(state,pos):#位置不冲突
   if len(state) == num - 1:#若是最后一个皇后,则返回该位置
    yield (pos,)
   else:#若不是最后一个皇后,则将该位置返回到state元组并传给后面的皇后
    for result in queens(num,state + (pos,)):
     yield (pos,) + result

哦,最后的最后,我们还得看看解决方案什么样,定义一个打印函数:

def prettyp(solution):
 '打印函数'
 def line(pos,length = len(solution)):
  '打印一行,皇后位置用X填充,其余用0填充'
  return 'O'*(pos)+'X'+'O'*(length-pos-1)
 for pos in solution:
  print(line(pos))

让我们看看效果:

import random
#随机打印一种
prettyp(random.choice(list(queens(8))))

D:\Python34\python.exe D:/Python34/hanshu.py
OOOOOOOX
OOXOOOOO
XOOOOOOO
OOOOOXOO
OXOOOOOO
OOOOXOOO
OOOOOOXO
OOOXOOOO
Process finished with exit code 0

完美达到预期,pass,哈哈。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
如何运行Python程序的方法
Apr 21 Python
在Python中操作时间之strptime()方法的使用
Dec 30 Python
python函数的5种参数详解
Feb 24 Python
Python模糊查询本地文件夹去除文件后缀的实例(7行代码)
Nov 09 Python
Python分析学校四六级过关情况
Nov 22 Python
详解tensorflow实现迁移学习实例
Feb 10 Python
Linux CentOS Python开发环境搭建教程
Nov 28 Python
Django 日志配置按日期滚动的方法
Jan 31 Python
pycharm设置默认的UTF-8编码模式的方法详解
Jun 01 Python
如何将anaconda安装配置的mmdetection环境离线拷贝到另一台电脑
Oct 15 Python
Python 微信公众号文章爬取的示例代码
Nov 30 Python
详解Python+OpenCV绘制灰度直方图
Mar 22 Python
python 标准差计算的实现(std)
Jul 29 #Python
Python 二叉树的层序建立与三种遍历实现详解
Jul 29 #Python
Python完成哈夫曼树编码过程及原理详解
Jul 29 #Python
Python秒算24点实现及原理详解
Jul 29 #Python
django之状态保持-使用redis存储session的例子
Jul 28 #Python
django 通过URL访问上传的文件方法
Jul 28 #Python
django使用admin站点上传图片的实例
Jul 28 #Python
You might like
用PHP实现多级树型菜单
2006/10/09 PHP
简单示例AJAX结合PHP代码实现登录效果代码
2008/07/25 PHP
PHP实现递归无限级分类
2015/10/22 PHP
CodeIgniter连贯操作的底层原理分析
2016/05/17 PHP
静态html文件执行php语句的方法(推荐)
2016/11/21 PHP
PHP重置数组为连续数字索引的几种方式总结
2018/03/12 PHP
PHP生成腾讯云COS接口需要的请求签名
2018/05/20 PHP
PHP数组Key强制类型转换实现原理解析
2020/09/01 PHP
JS中的数组方法笔记整理
2016/07/26 Javascript
关于使用axios的一些心得技巧分享
2017/07/02 Javascript
JavaScript实现随机五位数验证码
2019/09/27 Javascript
vuex实现数据状态持久化
2019/11/11 Javascript
vue 内联样式style中的background用法说明
2020/08/05 Javascript
python使用socket连接远程服务器的方法
2015/04/29 Python
Python实现短网址ShortUrl的Hash运算实例讲解
2015/08/10 Python
详解Python用户登录接口的方法
2019/04/17 Python
Python操作redis实例小结【String、Hash、List、Set等】
2019/05/16 Python
OpenCV 轮廓检测的实现方法
2019/07/03 Python
python实现12306登录并保存cookie的方法示例
2019/12/17 Python
Python 读取有公式cell的结果内容实例方法
2020/02/17 Python
python实现查找所有程序的安装信息
2020/02/18 Python
Python找出列表中出现次数最多的元素三种方式
2020/02/24 Python
PyCharm 2020 激活到 2100 年的教程
2020/03/25 Python
有关pycharm登录github时有的时候会报错connection reset的问题
2020/09/15 Python
韩国流行时尚女装网站:Dintchina(中文)
2018/07/19 全球购物
你懂得怎么写自荐信吗?
2013/12/27 职场文书
入党积极分子介绍信
2014/01/17 职场文书
军训自我鉴定
2014/01/22 职场文书
十八届三中全会宣传方案
2014/02/21 职场文书
五好文明家庭事迹材料
2014/12/20 职场文书
小学五一劳动节活动总结
2015/02/09 职场文书
2019年大学毕业生个人自我鉴定范文大全
2019/03/21 职场文书
javascript canvas实现雨滴效果
2021/06/09 Javascript
gateway网关接口请求的校验方式
2021/07/15 Java/Android
漫画「狩龙人拉格纳」公开TV动画预告图
2022/03/22 日漫
angular异步验证器防抖实例详解
2022/03/31 Javascript