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 24 Python
Python Web服务器Tornado使用小结
May 06 Python
Python实现检测服务器是否可以ping通的2种方法
Jan 01 Python
用Python编写一个简单的FUSE文件系统的教程
Apr 02 Python
解析Python中的异常处理
Apr 28 Python
python字符串的方法与操作大全
Jan 30 Python
Tensorflow实现卷积神经网络用于人脸关键点识别
Mar 05 Python
用Python配平化学方程式的方法
Jul 20 Python
Django接收post前端返回的json格式数据代码实现
Jul 31 Python
基于python监控程序是否关闭
Jan 14 Python
python中数据库like模糊查询方式
Mar 02 Python
keras实现基于孪生网络的图片相似度计算方式
Jun 11 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实现aes加密类分享
2014/02/16 PHP
win7安装php框架Yii的方法
2016/01/25 PHP
在页面上点击任一链接时触发一个事件的代码
2007/04/07 Javascript
js 浮动层菜单收藏
2009/01/16 Javascript
基于jquery的无限级联下拉框js插件
2011/10/29 Javascript
JQuery触发radio或checkbox的change事件
2012/12/18 Javascript
JS替换字符串中空格方法
2015/04/17 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件体系结构
2015/11/19 Javascript
浅谈Sublime Text 3运行JavaScript控制台
2016/06/06 Javascript
搭建简单的nodejs http服务器详解
2017/03/09 NodeJs
使用Vue制作图片轮播组件思路详解
2018/03/21 Javascript
详解Vue中数组和对象更改后视图不刷新的问题
2018/09/21 Javascript
vue学习之Vue-Router用法实例分析
2020/01/06 Javascript
webpack proxy 使用(代理的使用)
2020/01/10 Javascript
Python实现遍历windows所有窗口并输出窗口标题的方法
2015/03/13 Python
利用Python演示数型数据结构的教程
2015/04/03 Python
Python中用Decorator来简化元编程的教程
2015/04/13 Python
Django中的“惰性翻译”方法的相关使用
2015/07/27 Python
Python基于select实现的socket服务器
2016/04/13 Python
python中日志logging模块的性能及多进程详解
2017/07/18 Python
python删除文本中行数标签的方法
2018/05/31 Python
tensorflow实现加载mnist数据集
2018/09/08 Python
python 调试冷知识(小结)
2019/11/11 Python
Python求正态分布曲线下面积实例
2019/11/20 Python
手把手教你进行Python虚拟环境配置教程
2020/02/03 Python
HTML5 canvas基本绘图之绘制线段
2016/06/27 HTML / CSS
澳洲最大的时尚奢侈品电商平台:Cettire
2020/06/15 全球购物
海南地接欢迎词
2014/01/14 职场文书
四川成都导游欢迎词
2014/01/18 职场文书
幼儿园六一儿童节主持节目串词
2014/03/21 职场文书
大三学习计划书范文
2014/05/02 职场文书
学习焦裕禄同志为人民服务思想汇报
2014/09/10 职场文书
说好普通话圆梦你我他演讲稿
2014/09/21 职场文书
设备收款委托书范本
2014/10/02 职场文书
四风问题自我剖析材料
2014/10/07 职场文书
详解JVM系列之内存模型
2021/06/10 Javascript