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 Deque 模块使用详解
Jul 04 Python
Python计算程序运行时间的方法
Dec 13 Python
基于Django模板中的数字自增(详解)
Sep 05 Python
tensorflow识别自己手写数字
Mar 14 Python
解决python3爬虫无法显示中文的问题
Apr 12 Python
python中的文件打开与关闭操作命令介绍
Apr 26 Python
Python读取csv文件分隔符设置方法
Jan 14 Python
Python基础学习之函数方法实例详解
Jun 18 Python
python turtle库画一个方格和圆实例
Jun 27 Python
python zip()函数的使用示例
Sep 23 Python
Python用SSH连接到网络设备
Feb 18 Python
python装饰器代码解析
Mar 23 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+mysql删除指定编号员工信息的方法
2015/01/14 PHP
laravel 5 实现模板主题功能
2015/03/02 PHP
PHP读取PPT文件的方法
2015/12/10 PHP
PHP使用DOM和simplexml读取xml文档的方法示例
2017/02/08 PHP
Mootools 1.2教程 定时器和哈希简介
2009/09/15 Javascript
关于js中window.location.href,location.href,parent.location.href,top.location.href的用法与区别
2010/10/18 Javascript
jquery右下角弹出提示框示例代码
2013/10/08 Javascript
JS实现图片产生波纹一样flash效果的方法
2015/02/27 Javascript
如何获取元素的最终background-color
2017/02/06 Javascript
Node连接mysql数据库方法介绍
2017/02/07 Javascript
使用vue-router与v-if实现tab切换遇到的问题及解决方法
2018/09/07 Javascript
JavaScript 面向对象基础简单示例
2019/10/02 Javascript
小程序瀑布流组件实现翻页与图片懒加载
2020/05/19 Javascript
vue 调用 RESTful风格接口操作
2020/08/11 Javascript
vue $router和$route的区别详解
2020/12/02 Vue.js
gearman的安装启动及python API使用实例
2014/07/08 Python
Python中zfill()方法的使用教程
2015/05/20 Python
在Python中操作时间之mktime()方法的使用教程
2015/05/22 Python
使用PyCharm创建Django项目及基本配置详解
2018/10/24 Python
Django使用paginator插件实现翻页功能的实例
2018/10/24 Python
python opencv摄像头的简单应用
2019/06/06 Python
python执行scp命令拷贝文件及文件夹到远程主机的目录方法
2019/07/08 Python
pycharm中导入模块错误时提示Try to run this command from the system terminal
2020/03/26 Python
Python devel安装失败问题解决方案
2020/06/09 Python
python上下文管理器异常问题解决方法
2021/02/07 Python
美国中西部家用医疗设备商店:Med Mart(轮椅、踏板车、升降机等)
2019/04/26 全球购物
Linux机考试题
2015/10/16 面试题
《和我们一样享受春天》教学反思
2014/02/07 职场文书
家居装修公司创业计划书范文
2014/03/20 职场文书
行政监察建议书
2014/05/19 职场文书
教师工作自我鉴定范文
2014/09/14 职场文书
2015年医院创卫工作总结
2015/04/22 职场文书
2015年采购部工作总结
2015/04/23 职场文书
企业管理不到位检讨书
2019/06/27 职场文书
js作用域及作用域链工作引擎
2022/07/07 Javascript
JavaScript实现音乐播放器
2022/08/14 Javascript