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 29 Python
python实现通过shelve修改对象实例
Sep 26 Python
win10环境下python3.5安装步骤图文教程
Feb 03 Python
Python编程实现蚁群算法详解
Nov 13 Python
解决Python 爬虫URL中存在中文或特殊符号无法请求的问题
May 11 Python
python将txt文件读入为np.array的方法
Oct 30 Python
python中dir()与__dict__属性的区别浅析
Dec 10 Python
python利用小波分析进行特征提取的实例
Jan 09 Python
使用k8s部署Django项目的方法步骤
Jan 14 Python
Python根据成绩分析系统浅析
Feb 11 Python
解决pytorch 损失函数中输入输出不匹配的问题
Jun 05 Python
python装饰器代码解析
Mar 23 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设计模式 Bridge (桥接模式)
2011/06/26 PHP
php中preg_replace_callback函数简单用法示例
2016/07/21 PHP
手把手编写PHP框架 深入了解MVC运行流程
2016/09/19 PHP
IE8 原生JSON支持
2009/04/13 Javascript
网络之美 JavaScript中Get和Set访问器的实现代码
2010/09/19 Javascript
由Javascript实现的页面日历
2011/11/04 Javascript
Firefox中beforeunload事件的实现缺陷浅析
2012/05/03 Javascript
javascript使用正则控制input输入框允许输入的值方法大全
2014/06/19 Javascript
javascript封装的sqlite操作类实例
2015/07/17 Javascript
JavaScript检测上传文件大小的方法
2015/07/22 Javascript
编写高性能Javascript代码的N条建议
2015/10/12 Javascript
跟我学习javascript的函数调用和构造函数调用
2015/11/16 Javascript
jQuery实现div横向拖拽排序的简单实例
2016/07/13 Javascript
Vue.js 2.0 和 React、Augular等其他前端框架大比拼
2016/10/08 Javascript
根据输入邮箱号跳转到相应登录地址的解决方法
2016/12/13 Javascript
AngularJs上传前预览图片的实例代码
2017/01/20 Javascript
微信小程序picker组件简单用法示例【附demo源码下载】
2017/12/05 Javascript
使用Webpack提升Vue.js应用程序的4种方法(翻译)
2019/10/09 Javascript
Python 修改列表中的元素方法
2018/06/26 Python
django创建超级用户过程解析
2019/09/18 Python
python 魔法函数实例及解析
2019/09/25 Python
django-csrf使用和禁用方式
2020/03/13 Python
解决pytorch 数据类型报错的问题
2021/03/03 Python
CSS3 函数技巧 用css 实现js实现的事情(clac Counters Tooltip)
2017/08/15 HTML / CSS
HTML里显示pdf、word、xls、ppt的方法示例
2020/04/14 HTML / CSS
耐克巴西官方网站:Nike巴西
2016/08/14 全球购物
美国知名珠宝首饰品牌:Gemvara
2017/10/06 全球购物
十岁生日父母答谢词
2014/01/18 职场文书
先进个人事迹材料
2014/01/25 职场文书
公司门卫管理制度
2014/02/01 职场文书
校园标语大全
2014/06/19 职场文书
乡镇党建工作汇报材料
2014/10/27 职场文书
聚众斗殴罪辩护词
2015/05/21 职场文书
房屋质量投诉书
2015/07/02 职场文书
详解Java实现设计模式之责任链模式
2021/06/23 Java/Android
elasticSearch-api的具体操作步骤讲解
2021/06/28 Java/Android