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连接数据库学习之DB-API详解
Feb 07 Python
深入理解Django的自定义过滤器
Oct 17 Python
浅谈Django中的数据库模型类-models.py(一对一的关系)
May 30 Python
Python实用工具FuckIt.py介绍
Jul 02 Python
用python3 返回鼠标位置的实现方法(带界面)
Jul 05 Python
对Python中小整数对象池和大整数对象池的使用详解
Jul 09 Python
对python中不同模块(函数、类、变量)的调用详解
Jul 16 Python
Tensorflow实现神经网络拟合线性回归
Jul 19 Python
Python for循环及基础用法详解
Nov 08 Python
浅谈pytorch卷积核大小的设置对全连接神经元的影响
Jan 10 Python
python中urllib.request和requests的使用及区别详解
May 05 Python
pytorch中的torch.nn.Conv2d()函数图文详解
Feb 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
关于PHP结束标签的使用细节探讨及联想
2013/03/04 PHP
Yii2实现多域名跨域同步登录退出
2017/02/04 PHP
基于Jquery实现的一个图片滚动切换
2012/06/21 Javascript
javascript数组输出的两种方式
2015/01/13 Javascript
javascript+html5实现仿flash滚动播放图片的方法
2015/04/27 Javascript
jQuery禁用键盘后退屏蔽F5刷新及禁用右键单击
2016/01/22 Javascript
基于BootStrap栅格栏系统完成网站底部版权信息区
2016/12/23 Javascript
Restify中接入Socket.io报Error:Can’t set headers的错误解决
2017/03/28 Javascript
浅谈angularjs中响应回车事件
2017/04/24 Javascript
jQuery Layer弹出层传值到父页面的实现代码
2017/08/17 jQuery
JavaScript实现开关等效果
2017/09/08 Javascript
[01:00:25]NB vs Secret 2018国际邀请赛小组赛BO1 B组加赛 8.19
2018/08/21 DOTA
[32:30]夜魇凡尔赛茶话会 第一期01:谁是卧底
2021/03/11 DOTA
Python基于opencv实现的简单画板功能示例
2019/03/04 Python
Python八皇后问题解答过程详解
2019/07/29 Python
简单分析python的类变量、实例变量
2019/08/23 Python
python模块常用用法实例详解
2019/10/17 Python
python生成13位或16位时间戳以及反向解析时间戳的实例
2020/03/03 Python
Python基于gevent实现文件字符串查找器
2020/08/11 Python
canvas离屏技术与放大镜实现代码示例
2018/08/31 HTML / CSS
原装进口全世界:天猫国际
2016/08/03 全球购物
Expedia丹麦:全球领先的旅游网站
2018/03/18 全球购物
香港艺人陈冠希创办的潮流品牌:JUICESTORE
2021/03/04 全球购物
研修第一天随笔感言
2014/02/15 职场文书
学校地质灾害防治方案
2014/06/10 职场文书
战友聚会策划方案
2014/06/13 职场文书
2014年中班下学期工作总结
2014/12/11 职场文书
2015年度党风廉政建设工作情况汇报
2015/01/02 职场文书
幼儿园教师自我评价
2015/03/04 职场文书
2015年精神文明建设工作总结
2015/04/21 职场文书
小鞋子观后感
2015/06/05 职场文书
实施意见格式范本
2015/06/05 职场文书
信息技术课教学反思
2016/02/23 职场文书
nginx 多个location转发任意请求或访问静态资源文件的实现
2021/03/31 Servers
如何在向量化NumPy数组上进行移动窗口
2021/05/18 Python
详解CSS玩转图片Base64编码
2021/05/25 HTML / CSS