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 相关文章推荐
pygame学习笔记(2):画点的三种方法和动画实例
Apr 15 Python
Python正则表达式分组概念与用法详解
Jun 24 Python
关于python的list相关知识(推荐)
Aug 30 Python
Python实现可自定义大小的截屏功能
Jan 20 Python
对python中类的继承与方法重写介绍
Jan 20 Python
python按键按住不放持续响应的实例代码
Jul 17 Python
python3.7 openpyxl 删除指定一列或者一行的代码
Oct 08 Python
Python代码执行时间测量模块timeit用法解析
Jul 01 Python
Python+pyftpdlib实现局域网文件互传
Aug 24 Python
python 如何对logging日志封装
Dec 02 Python
python之随机数函数的实现示例
Dec 30 Python
浅谈哪个Python库才最适合做数据可视化
Jun 28 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
yii实现级联下拉菜单的方法
2014/07/31 PHP
PHP编程计算文件或数组中单词出现频率的方法
2017/05/22 PHP
php语言注释,单行注释和多行注释
2018/01/21 PHP
Add a Picture to a Microsoft Word Document
2007/06/15 Javascript
通过 Dom 方法提高 innerHTML 性能
2008/03/26 Javascript
基于JQuery制作的产品广告效果
2010/12/08 Javascript
表单序列化与jq中的serialize使用示例
2014/02/21 Javascript
Bootstrap每天必学之js插件
2015/11/30 Javascript
举例讲解如何判断JavaScript中对象的类型
2016/04/22 Javascript
Bootstrap Img 图片样式(推荐)
2016/12/13 Javascript
Angular4如何自定义首屏的加载动画详解
2017/07/26 Javascript
vue+socket.io+express+mongodb 实现简易多房间在线群聊示例
2017/10/21 Javascript
详解angular脏检查原理及伪代码实现
2018/06/08 Javascript
vue中element 上传功能的实现思路
2018/07/06 Javascript
axios的拦截请求与响应方法
2018/08/11 Javascript
js在HTML的三种引用方式详解
2020/08/29 Javascript
如何基于viewport vm适配移动端页面
2020/11/13 Javascript
python获取从命令行输入数字的方法
2015/04/29 Python
Python使用matplotlib实现绘制自定义图形功能示例
2018/01/18 Python
Python简单实现查找一个字符串中最长不重复子串的方法
2018/03/26 Python
对numpy的array和python中自带的list之间相互转化详解
2018/04/13 Python
在python中用url_for构造URL的方法
2019/07/25 Python
在python3中使用shuffle函数要注意的地方
2020/02/28 Python
Python读取xlsx数据生成图标代码实例
2020/08/12 Python
python 5个实用的技巧
2020/09/27 Python
Python+OpenCV图像处理—— 色彩空间转换
2020/10/22 Python
Nip + Fab官网:英国美容品牌
2019/08/26 全球购物
Expedia瑞典官网:预订度假屋、酒店、汽车租赁、机票等
2021/01/23 全球购物
心得体会开头
2014/01/01 职场文书
工程造价专业大学生职业生涯规划书
2014/01/18 职场文书
《自选商场》教学反思
2014/02/14 职场文书
村级换届选举方案
2014/05/10 职场文书
六查六看心得体会
2014/10/14 职场文书
飞越疯人院观后感
2015/06/09 职场文书
餐饮行业关注的9大营销策略
2019/08/26 职场文书
Go timer如何调度
2021/06/09 Golang