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 流程控制实例代码
Sep 25 Python
Python入门篇之正则表达式
Oct 20 Python
python中解析json格式文件的方法示例
May 03 Python
Python常见异常分类与处理方法
Jun 04 Python
Django中使用Whoosh进行全文检索的方法
Mar 31 Python
在Django model中设置多个字段联合唯一约束的实例
Jul 17 Python
tensorflow -gpu安装方法(不用自己装cuda,cdnn)
Jan 20 Python
python3实现往mysql中插入datetime类型的数据
Mar 02 Python
python print 格式化输出,动态指定长度的实现
Apr 12 Python
python 如何设置守护进程
Oct 29 Python
windows+vscode安装paddleOCR运行环境的步骤
Nov 11 Python
Python趣味实战之手把手教你实现举牌小人生成器
Jun 07 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
基于mysql的论坛(6)
2006/10/09 PHP
PHP获取mysql数据表的字段名称和详细信息的方法
2014/09/27 PHP
百度工程师讲PHP函数的实现原理及性能分析(二)
2015/05/13 PHP
浅谈PDO的rowCount函数
2015/06/18 PHP
PHP文件上传问题汇总(文件大小检测、大文件上传处理)
2015/12/24 PHP
Thinkphp框架 表单自动验证登录注册 ajax自动验证登录注册
2016/12/27 PHP
yii框架使用分页的方法分析
2019/07/25 PHP
jQuery 1.5最新版本的改进细节分析
2011/01/19 Javascript
JavaScript中一个奇葩的IE浏览器判断方法
2014/04/16 Javascript
jQuery插件简单实现方法
2015/07/18 Javascript
谈谈JSON对象和字符串之间的相互转换JSON.stringify(obj)和JSON.parse(string)
2015/10/01 Javascript
分享纯手写漂亮的表单验证
2015/11/19 Javascript
深入理解JavaScript程序中内存泄漏
2016/03/17 Javascript
java中String类型变量的赋值问题介绍
2016/03/23 Javascript
jQuery实现鼠标选文字发新浪微博的方法
2016/04/02 Javascript
Bootstrap三种表单布局的使用方法
2016/06/21 Javascript
一个炫酷的Bootstrap导航菜单
2016/12/28 Javascript
jQuery 实时保存页面动态添加的数据的示例
2017/08/14 jQuery
JavaScript正则表达式函数总结(常用)
2018/02/22 Javascript
JS array数组检测方式解析
2020/05/19 Javascript
Vue使用自定义指令实现拖拽行为实例分析
2020/06/06 Javascript
jquery实现点击左右按钮切换图片
2021/01/27 jQuery
Python 初始化多维数组代码
2008/09/06 Python
举例讲解Python中装饰器的用法
2015/04/27 Python
python插入排序算法实例分析
2015/07/03 Python
Python这样操作能存储100多万行的xlsx文件
2019/04/16 Python
linux下安装python3和对应的pip环境教程详解
2019/07/01 Python
python matplotlib饼状图参数及用法解析
2019/11/04 Python
Python中生成一个指定长度的随机字符串实现示例
2019/11/06 Python
python误差棒图errorbar()函数实例解析
2020/02/11 Python
python 解决pycharm运行py文件只有unittest选项的问题
2020/09/01 Python
数控机械专业个人的自我评价
2014/01/02 职场文书
尊老爱亲美德少年事迹材料
2014/08/14 职场文书
2014年乡镇工会工作总结
2014/12/02 职场文书
公积金接收函格式
2015/01/30 职场文书
2015年环卫处个人工作总结
2015/07/27 职场文书