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中列表生成式的用法
Mar 31 Python
Python Property属性的2种用法
Jun 21 Python
python3.5 + PyQt5 +Eric6 实现的一个计算器代码
Mar 11 Python
用pickle存储Python的原生对象方法
Apr 28 Python
基于Django filter中用contains和icontains的区别(详解)
Dec 12 Python
Python TestCase中的断言方法介绍
May 02 Python
20行python代码实现人脸识别
May 05 Python
Pytorch 实现sobel算子的卷积操作详解
Jan 10 Python
python关于变量名的基础知识点
Mar 03 Python
简述python Scrapy框架
Aug 17 Python
告别网页搜索!教你用python实现一款属于自己的翻译词典软件
Jun 03 Python
利用Python实现Picgo图床工具
Nov 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设计模式 Mediator (中介者模式)
2011/06/26 PHP
解析PHP中的file_get_contents获取远程页面乱码的问题
2013/06/25 PHP
回帖脱衣服的图片实现代码
2014/02/15 PHP
PHP验证码类ValidateCode解析
2017/01/07 PHP
cakephp常见知识点汇总
2017/02/24 PHP
thinkphp3.2实现跨控制器调用其他模块的方法
2017/03/14 PHP
MC Dialog js弹出层 完美兼容多浏览器(5.6更新)
2010/05/06 Javascript
Jquery中删除元素的实现代码
2011/12/29 Javascript
那些年,我还在学习jquery 学习笔记
2012/03/05 Javascript
checkbox勾选判断代码分析
2014/06/11 Javascript
JavaScript的各种常见函数定义方法
2014/09/16 Javascript
代码分析jQuery四种静态方法使用
2015/07/23 Javascript
js模拟淘宝网的多级选择菜单实现方法
2015/08/18 Javascript
使用jQuery UI库开发Web界面的简单入门指引
2016/04/22 Javascript
关于JS 预解释的相关理解
2016/06/28 Javascript
微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)
2017/01/12 Javascript
jQuery模拟爆炸倒计时功能实例代码
2017/08/21 jQuery
基于JavaScript中字符串的match与replace方法(详解)
2017/12/04 Javascript
js中this对象用法分析
2018/01/05 Javascript
在vue项目中,使用axios跨域处理
2018/03/07 Javascript
简单介绍react redux的中间件的使用
2018/04/06 Javascript
bootstrap table表格插件之服务器端分页实例代码
2018/09/12 Javascript
JS选取DOM元素常见操作方法实例分析
2018/12/10 Javascript
Vue infinite update loop的问题解决
2019/04/23 Javascript
vue中配置scss全局变量的步骤
2020/12/28 Vue.js
github配置使用指南
2014/11/18 Python
python简单实现获取当前时间
2016/08/27 Python
Python打包可执行文件的方法详解
2016/09/19 Python
Pycharm远程调试openstack的方法
2017/11/21 Python
python函数中将变量名转换成字符串实例
2020/05/11 Python
tensorflow 大于某个值为1,小于为0的实例
2020/06/30 Python
HTML5新增的8类INPUT输入类型介绍
2015/07/06 HTML / CSS
党员干部公开承诺书
2014/03/26 职场文书
业务员岗位职责范本
2015/04/03 职场文书
企业法人任命书
2015/09/21 职场文书
OpenCV实现普通阈值
2021/11/17 Java/Android