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处理图片之打开\显示\保存图像的方法
May 04 Python
python基于物品协同过滤算法实现代码
May 31 Python
python爬取网页转换为PDF文件
Jun 07 Python
Python根据文件名批量转移图片的方法
Oct 21 Python
Python这样操作能存储100多万行的xlsx文件
Apr 16 Python
Pytorch中accuracy和loss的计算知识点总结
Sep 10 Python
python基于K-means聚类算法的图像分割
Oct 30 Python
python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析
Mar 08 Python
Python实现画图软件功能方法详解
Jul 28 Python
python 输入字符串生成所有有效的IP地址(LeetCode 93号题)
Oct 15 Python
python 爬取豆瓣网页的示例
Apr 13 Python
python如何正确使用yield
May 21 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 开始 PHP 会话
2006/12/21 PHP
php把数据表导出为Excel表的最简单、最快的方法(不用插件)
2014/05/10 PHP
PHP生成图片验证码、点击切换实例
2014/06/25 PHP
Yii使用find findAll查找出指定字段的实现方法
2014/09/05 PHP
一个不错的用JavaScript实现的UBB编码函数
2007/03/09 Javascript
js 代码优化点滴记录
2012/02/19 Javascript
带左右箭头图片轮播的JS代码
2013/12/18 Javascript
Javascript堆排序算法详解
2014/12/03 Javascript
HTML5之WebSocket入门3 -通信模型socket.io
2015/08/21 Javascript
Jquery ajax加载等待执行结束再继续执行下面代码操作
2015/11/24 Javascript
原生和jQuery的ajax用法详解
2017/01/23 Javascript
Vue.use源码分析
2017/04/22 Javascript
React中的render何时执行过程
2018/04/13 Javascript
layui加载表格,绑定新增,编辑删除,查看按钮事件的例子
2019/09/06 Javascript
js 下拉菜单点击旁边收起实现(踩坑记)
2019/09/29 Javascript
Python语言的12个基础知识点小结
2014/07/10 Python
Python计算程序运行时间的方法
2014/12/13 Python
在Python中使用PIL模块处理图像的教程
2015/04/29 Python
设计模式中的原型模式在Python程序中的应用示例
2016/03/02 Python
有趣的python小程序分享
2017/12/05 Python
Python读取properties配置文件操作示例
2018/03/29 Python
python写入并获取剪切板内容的实例
2018/05/31 Python
PYQT5实现控制台显示功能的方法
2019/06/25 Python
简单了解Java Netty Reactor三种线程模型
2020/04/26 Python
Python经纬度坐标转换为距离及角度的实现
2020/11/01 Python
迪士尼英国官方商店:shopDisney UK
2019/09/21 全球购物
机械工程系毕业生求职信
2013/09/27 职场文书
两只小狮子教学反思
2014/02/05 职场文书
英雄儿女观后感
2015/06/09 职场文书
2015年小学教科研工作总结
2015/07/20 职场文书
写好求职信的技巧解密
2019/05/14 职场文书
redis 限制内存使用大小的实现
2021/05/08 Redis
pytorch中的numel函数用法说明
2021/05/13 Python
Python自动化爬取天眼查数据的实现
2021/06/15 Python
Win11怎么启动任务管理器?Win11启动任务管理器的几种方法
2021/11/23 数码科技
全新239军机修复记
2022/04/05 无线电