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+Django在windows下的开发环境配置图解
Nov 11 Python
Python和perl实现批量对目录下电子书文件重命名的代码分享
Nov 21 Python
Python实现周期性抓取网页内容的方法
Nov 04 Python
web.py 十分钟创建简易博客实现代码
Apr 22 Python
图文详解WinPE下安装Python
May 17 Python
解决Python pandas df 写入excel 出现的问题
Jul 04 Python
tensorflow实现逻辑回归模型
Sep 08 Python
python基于plotly实现画饼状图代码实例
Dec 16 Python
pycharm 代码自动补全的实现方法(图文)
Sep 18 Python
如何使用Python调整图像大小
Sep 26 Python
python绘图模块之利用turtle画图
Feb 12 Python
宝塔更新Python及Flask项目的部署
Apr 11 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初学入门
2006/11/19 PHP
反射调用private方法实践(php、java)
2015/12/21 PHP
php抛出异常与捕捉特定类型的异常详解
2016/10/26 PHP
php封装一个异常的处理类
2017/06/08 PHP
php双层循环(九九乘法表)
2017/10/23 PHP
PHP生成推广海报的方法分享
2018/04/22 PHP
php常用字符串长度函数strlen()与mb_strlen()用法实例分析
2019/06/25 PHP
jquery 锁定弹出层实现代码
2010/02/23 Javascript
gridpanel动态加载数据的实例代码
2013/07/18 Javascript
JavaScript基础教程——入门必看篇
2016/05/20 Javascript
JS实现的相册图片左右滚动完整实例
2016/11/23 Javascript
jQuery Easyui加载表格出错时在表格中间显示自定义的提示内容
2016/12/08 Javascript
进阶之初探nodeJS
2017/01/24 NodeJs
JavaScript实现带有子菜单和控件的slider轮播图效果
2017/11/01 Javascript
基于vue.js 2.x的虚拟滚动条的示例代码
2018/01/23 Javascript
浅谈Node.js 中间件模式
2018/06/12 Javascript
Vue路由history模式解决404问题的几种方法
2018/09/29 Javascript
python选择排序算法的实现代码
2013/11/21 Python
Python中函数的参数传递与可变长参数介绍
2015/06/30 Python
Django如何实现内容缓存示例详解
2017/09/24 Python
Python实现判断给定列表是否有重复元素的方法
2018/04/11 Python
Python3的高阶函数map,reduce,filter的示例详解
2019/07/23 Python
解决pycharm不能自动保存在远程linux中的问题
2021/02/06 Python
纯css3实现走马灯效果
2014/12/26 HTML / CSS
Hotels.com中国区:好订网
2016/08/18 全球购物
英国最大的化装舞会服装网站:Fancydress.com
2017/08/15 全球购物
全球最大的生存食品、水和装备专用在线市场:BePrepared.com
2020/01/02 全球购物
类如何去实现接口
2013/12/19 面试题
书香校园活动方案
2014/02/28 职场文书
yy婚礼主持词
2014/03/14 职场文书
房地产销售主管岗位职责
2015/02/13 职场文书
汽车4S店前台接待岗位职责
2015/04/03 职场文书
停电通知范文
2015/04/16 职场文书
学校勤俭节约倡议书
2015/04/29 职场文书
写自招自荐信的绝招!
2019/04/19 职场文书
因个人工作失误检讨书
2019/06/21 职场文书