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实现端口复用实例代码
Jul 03 Python
python实现随机森林random forest的原理及方法
Dec 21 Python
Pandas Shift函数的基础入门学习笔记
Nov 16 Python
python中的逆序遍历实例
Dec 25 Python
关于Keras模型可视化教程及关键问题的解决
Jan 24 Python
python求numpy中array按列非零元素的平均值案例
Jun 08 Python
keras分类之二分类实例(Cat and dog)
Jul 09 Python
python代码实现图书管理系统
Nov 30 Python
python不同版本的_new_不同点总结
Dec 09 Python
python自动化办公操作PPT的实现
Feb 05 Python
python用tkinter开发的扫雷游戏
Jun 01 Python
使用Python通过企业微信应用给企业成员发消息
Apr 18 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生成图片验证码的实例讲解
2015/08/03 PHP
thinkPHP5框架自定义验证器实现方法分析
2018/06/11 PHP
JavaScript中令你抓狂的魔术变量
2006/11/30 Javascript
JavaScript prototype属性使用说明
2010/05/13 Javascript
Javascript中的变量使用说明
2010/05/18 Javascript
JQuery浮动DIV提示信息并自动隐藏的代码
2010/08/29 Javascript
Jquery优化效率 提升性能解决方案
2010/09/06 Javascript
Angular Js文件上传之form-data
2015/08/28 Javascript
Javascript实现的SHA-256加密算法完整实例
2016/02/02 Javascript
jQuery xml字符串的解析、读取及查找方法
2016/03/01 Javascript
全面理解JavaScript中的闭包
2016/05/12 Javascript
微信开发之调起摄像头、本地展示图片、上传下载图片实例
2016/12/08 Javascript
Vue 实用分页paging实例代码
2017/04/12 Javascript
详解Vue如何支持JSX语法
2017/11/10 Javascript
vue父组件向子组件传递多个数据的实例
2018/03/01 Javascript
vue基于element-ui的三级CheckBox复选框功能的实现代码
2018/10/15 Javascript
深入浅析javascript函数中with
2018/10/28 Javascript
详解vue 组件注册
2020/11/20 Vue.js
JavaScript实现雪花飘落效果
2020/12/27 Javascript
通过滑动翻页效果实现和移动端click事件问题
2021/01/26 Javascript
Django 如何获取前端发送的头文件详解(推荐)
2017/08/15 Python
使用pandas对两个dataframe进行join的实例
2018/06/08 Python
我用Python抓取了7000 多本电子书案例详解
2019/03/25 Python
FFrpc python客户端lib使用解析
2019/08/24 Python
使用CSS3来代替JS实现交互
2017/08/10 HTML / CSS
用CSS3实现瀑布流布局的示例代码
2017/11/10 HTML / CSS
实习生求职自荐信
2014/02/07 职场文书
促销活动计划书
2014/05/02 职场文书
求职信标题怎么写
2014/05/26 职场文书
委托书怎么写
2014/07/31 职场文书
工作经历证明范本
2015/06/15 职场文书
python爬虫之利用selenium模块自动登录CSDN
2021/04/22 Python
详解TS数字分隔符和更严格的类属性检查
2021/05/06 Javascript
CSS 一行代码实现头像与国旗的融合
2021/10/24 HTML / CSS
muduo TcpServer模块源码分析
2022/04/26 Redis
python如何将mat文件转为png
2022/07/15 Python