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里隐藏的“禅”
Jun 16 Python
python3.4下django集成使用xadmin后台的方法
Aug 15 Python
Python实现判断字符串中包含某个字符的判断函数示例
Jan 08 Python
Python 从相对路径下import的方法
Dec 04 Python
Jupyter notebook在mac:linux上的配置和远程访问的方法
Jan 14 Python
Python单元测试与测试用例简析
Nov 09 Python
python文件和文件夹复制函数
Feb 07 Python
Python多线程通信queue队列用法实例分析
Mar 24 Python
python交互模式基础知识点学习
Jun 18 Python
Python如何telnet到网络设备
Feb 18 Python
python3实现常见的排序算法(示例代码)
Jul 04 Python
Python turtle编写简单的球类小游戏
Mar 31 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在文件指定行中写入代码的方法
2012/05/23 PHP
php daddslashes()和 saddslashes()有哪些区别分析
2012/10/26 PHP
优化WordPress的Google字体以加速国内服务器上的运行
2015/11/24 PHP
让Firefox支持event对象实现代码
2009/11/07 Javascript
使用SyntaxHighlighter实现HTML高亮显示代码的方法
2010/02/04 Javascript
来自qq的javascript面试题
2010/07/24 Javascript
javascript学习笔记(十四) window对象使用介绍
2012/06/20 Javascript
JS组件Bootstrap ContextMenu右键菜单使用方法
2016/04/17 Javascript
基于Bootstrap+jQuery.validate实现表单验证
2016/05/30 Javascript
JS实现星星评分功能实例代码(两种方法)
2016/06/09 Javascript
jQuery复合事件结合toggle()方法的用法示例
2017/06/10 jQuery
JavaScript实现瀑布流图片效果
2017/06/30 Javascript
echarts整合多个类似option的方法实例
2018/07/10 Javascript
vue如何进行动画的封装
2018/09/26 Javascript
vue 清空input标签 中file的值操作
2020/07/21 Javascript
Vue+Bootstrap收藏(点赞)功能逻辑与具体实现
2020/10/22 Javascript
[02:42]DOTA2城市挑战赛收官在即 四强之争风起云涌
2018/06/05 DOTA
[56:14]Fnatic vs OG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
2018/03/15 Python
浅谈Python3识别判断图片主要颜色并和颜色库进行对比的方法
2019/10/25 Python
python处理RSTP视频流过程解析
2020/01/11 Python
Python yield生成器和return对比代码实例
2020/04/20 Python
win10安装python3.6的常见问题
2020/07/01 Python
Pycharm调试程序技巧小结
2020/08/08 Python
matplotlib实现数据实时刷新的示例代码
2021/01/05 Python
No module named ‘win32gui‘ 的解决方法(踩坑之旅)
2021/02/18 Python
HTML5 placeholder(空白提示)属性介绍
2013/08/07 HTML / CSS
Kate Spade美国官网:纽约新兴时尚品牌,以包包闻名于世
2017/11/09 全球购物
Oral-B荷兰:牙医最推荐的品牌
2020/02/25 全球购物
Ibatis中如何提高SQL Map的性能
2013/05/11 面试题
战友聚会邀请函
2014/01/18 职场文书
带薪年假请假条
2014/02/04 职场文书
甜品店创业计划书
2014/09/21 职场文书
2014年度工作总结报告
2014/12/15 职场文书
惹女朋友生气检讨书
2015/05/06 职场文书
python 解决微分方程的操作(数值解法)
2021/05/26 Python