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实现探测socket和web服务示例
Mar 28 Python
Python中AND、OR的一个使用小技巧
Feb 18 Python
Python验证企业工商注册码
Oct 25 Python
python实现泊松图像融合
Jul 26 Python
Python sklearn KFold 生成交叉验证数据集的方法
Dec 11 Python
python实现爬山算法的思路详解
Apr 09 Python
pytorch中的embedding词向量的使用方法
Aug 18 Python
Python从文件中读取指定的行以及在文件指定位置写入
Sep 06 Python
什么是Python中的匿名函数
Jun 02 Python
Python接口自动化系列之unittest结合ddt的使用教程详解
Feb 23 Python
Python的flask接收前台的ajax的post数据和get数据的方法
Apr 12 Python
python 如何将两个实数矩阵合并为一个复数矩阵
May 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
浅谈Windows下 PHP4.0与oracle 8的连接设置
2006/10/09 PHP
php中实现xml与mysql数据相互转换的方法
2014/12/25 PHP
老生常谈PHP 文件写入和读取(必看篇)
2017/05/22 PHP
PHP框架实现WebSocket在线聊天通讯系统
2019/11/21 PHP
js 事件处理函数间的Event物件是否全等
2011/04/08 Javascript
客户端js判断文件类型和文件大小即限制上传大小
2013/11/20 Javascript
Javascript图片上传前的本地预览实例
2014/06/16 Javascript
JQuery中的html()、text()、val()区别示例介绍
2014/09/01 Javascript
封装获取dom元素的简单实例
2016/07/08 Javascript
让html元素随浏览器的大小自适应垂直居中的实现方法
2016/10/12 Javascript
基于Vuejs框架实现翻页组件
2020/06/29 Javascript
纯JS焦点图特效实例(可一个页面多用)
2016/12/07 Javascript
Bootstrap CSS布局之表单
2016/12/17 Javascript
JQuery 获取多个select标签option的text内容(实例)
2017/09/07 jQuery
vue.js移动数组位置,同时更新视图的方法
2018/03/08 Javascript
vue父组件触发事件改变子组件的值的方法实例详解
2019/05/07 Javascript
babel7.x和webpack4.x配置vue项目的方法步骤
2019/05/12 Javascript
javascript数组常见操作方法实例总结【连接、添加、删除、去重、排序等】
2019/06/13 Javascript
详解Python进程间通信之命名管道
2017/08/28 Python
python实现感知器算法详解
2017/12/19 Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
2019/10/30 Python
pytorch-神经网络拟合曲线实例
2020/01/15 Python
Spring http服务远程调用实现过程解析
2020/06/11 Python
基于python获取本地时间并转换时间戳和日期格式
2020/10/27 Python
一个入门级python爬虫教程详解
2021/01/27 Python
使用Python制作一盏 3D 花灯喜迎元宵佳节
2021/02/26 Python
中学教师培训制度
2014/01/31 职场文书
离婚协议书范本样本
2014/08/19 职场文书
平安建设汇报材料
2014/12/29 职场文书
学校党支部承诺书
2015/04/30 职场文书
学生会部长竞选稿
2015/11/19 职场文书
有关信念的名言语录集锦
2019/12/06 职场文书
Python爬虫进阶之Beautiful Soup库详解
2021/04/29 Python
react国际化react-intl的使用
2021/05/06 Javascript
MySQL数据库必备之条件查询语句
2021/10/15 MySQL
cypress测试本地web应用
2022/06/01 Javascript