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实现根据指定端口探测服务器/模块部署的方法
Aug 25 Python
Python中的引用和拷贝浅析
Nov 22 Python
Python中json格式数据的编码与解码方法详解
Jul 01 Python
Python判断某个用户对某个文件的权限
Oct 13 Python
python爬虫中get和post方法介绍以及cookie作用
Feb 08 Python
Python中生成器和迭代器的区别详解
Feb 10 Python
Python可变和不可变、类的私有属性实例分析
May 31 Python
Python Django切换MySQL数据库实例详解
Jul 16 Python
python多维数组分位数的求取方式
Mar 03 Python
python实现超级马里奥
Mar 18 Python
python实现3D地图可视化
Mar 25 Python
python 实现图片修复(可用于去水印)
Nov 19 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 日常开发小技巧
2009/09/23 PHP
C#静态方法与非静态方法实例分析
2014/09/22 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
JavaScript中“+=”的应用
2007/02/02 Javascript
JQuery 绑定事件时传递参数的实现方法
2009/10/13 Javascript
JavaScript.Encode手动解码技巧
2010/07/14 Javascript
javascript写的简单的计算器,内容很多,方法实用,推荐
2011/12/29 Javascript
js 获取(接收)地址栏参数值的方法
2013/04/01 Javascript
用JavaScript实现用一个DIV来包装文本元素节点
2014/09/09 Javascript
jQuery右侧选项卡焦点图片轮播特效代码分享
2015/09/05 Javascript
jQuery获取radio选中项的值实例
2016/06/18 Javascript
jQuery+CSS3实现点赞功能
2017/03/13 Javascript
jQuery+pjax简单示例汇总
2017/04/21 jQuery
vue购物车插件编写代码
2017/11/27 Javascript
微信小程序tabBar模板用法实例分析【附demo源码下载】
2017/11/28 Javascript
对vue事件的延迟执行实例讲解
2018/08/28 Javascript
详解KOA2如何手写中间件(装饰器模式)
2018/10/11 Javascript
mpvue 单文件页面配置详解
2018/12/02 Javascript
arctext.js实现文字平滑弯曲弧形效果的插件
2019/05/13 Javascript
微信小程序环境下将文件上传到OSS的方法步骤
2019/05/31 Javascript
angular组件间传值测试的方法详解
2020/05/07 Javascript
[51:26]VP vs VG 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python Web服务器Tornado使用小结
2014/05/06 Python
python处理文本文件实现生成指定格式文件的方法
2014/07/31 Python
pycharm下查看python的变量类型和变量内容的方法
2018/06/26 Python
对Python通过pypyodbc访问Access数据库的方法详解
2018/10/27 Python
Pytorch加载部分预训练模型的参数实例
2019/08/18 Python
在python中利用dict转json按输入顺序输出内容方式
2020/02/27 Python
Django用数据库表反向生成models类知识点详解
2020/03/25 Python
Python绘制动态水球图过程详解
2020/06/03 Python
NBA欧洲商店(英国):NBA Europe Store UK
2018/07/27 全球购物
环保建议书300字
2014/05/14 职场文书
个人自我剖析材料
2014/09/30 职场文书
民主评议党员总结
2014/10/20 职场文书
元旦晚会开场白
2015/05/29 职场文书
感恩老师主题班会
2015/08/12 职场文书