python实现三壶谜题的示例详解


Posted in Python onNovember 02, 2020

前言

有一个充满水的8品脱的水壶和两个空水壶(容积分别是5品脱和3品脱)。通过将水壶完全倒满水和将水壶的水完全倒空这两种方式,在其中的一个水壶中得到4品脱的水。

一、算法思想

算法分析

  1. 采用的算法思想是将某个时刻水壶中水的数量看作一个状态,用一个长度为3的数组表示。
  2. 初始状态便为[8,0,0],再拓展他的下一结点的可能结构。
  3. 若下一结点的结构已经被拓展过了便放弃,若没有拓展过则加入拓展列表(open_list)中。然后递归上述操作。
  4. 直到拓展列表(open_list)为空或者找到目标为止。

思想图解

这里的第一个数就代表着是那个8品脱的瓶子,依次分别是8品脱,5品脱,3品脱

python实现三壶谜题的示例详解

就如同上图一样,使用层次遍历一次一次递归扩展新的结点,知道找到4品脱的水或者无结点可扩展为止(类似于广度优先遍历)。

二、代码展示

1.创建树节点结构

节点包括两个属性,一个属性是数组类型的,存储当前三个水壶的容量状态,另一个属性是记录它是由哪个结点扩展过来的,以便找到解决路径:

class node: # 创建树节点
 def __init__(self, data):
  self.data = data # 存储三个壶的容量状态
  self.per = None # 存储上一时刻三个壶的容量状态

2.实现倾倒动作

由于这里只有三个壶,互相倾倒的方案可以枚举出来,所有我就没使用二重嵌套循环,而是使用一层循环:

def pour(n): # 扩展子节点
 r_list = n.data # 记录当前三个水壶的容量状态
 max_list = [8, 5, 3] # 水壶的最大容量
 for i, j in ((0, 1), (0, 2), (1, 2), (1, 0), (2, 0), (2, 1)):
  if r_list[i] != 0:
   n_list = r_list.copy() # 初始化下一结点的水壶状态
   if r_list[i] + r_list[j] > max_list[j]:
    n_list[i] = r_list[i] - (max_list[j] - r_list[j])
    n_list[j] = max_list[j]
   else:
    n_list[j] = r_list[i] + r_list[j]
    n_list[i] = 0
   flag = True # 记录水壶的状态是否已经发生过(扩展过)
   for one in closed_list:
    if one.data == n_list: # 比较当前水壶状态和以往记录过得水壶状态
     flag = False
   if flag:
    print("扩展的新节点是:",n_list)
    new_node = node(n_list) # 创建新节点存储水壶的新状态
    new_node.per = n
    open_list.append(new_node)

主递归函数

查看当前是否已经扩展到4品脱的水或者是否还有结点可以扩展。

def BFS_node(root_1): # 递归查找子节点的扩展状态以及查验是否找到4品脱的水壶
 n = root_1
 print("当前节点:",n.data)
 if open_list is None:
  return "没有找到4品脱的水"
 nodelist = n.data
 if 4 in nodelist:
  print("找到了4品脱的水")
  print_node(n)
  return "找到了4品脱的水"
 closed_list.append(open_list.pop(0))
 pour(n)
 print("*******")
 BFS_node(open_list[0])

数据初始化

数据初始化,以及找到4品脱水后打印路径的打印函数。

def print_node(n): # 打印正确的水壶操作路径
 if n.per == None:
  return ""
 print(n.data)
 print_node(n.per)


# 初始化数据
root = node([8, 0, 0])
open_list = [root] # 存储已找到却未被扩展的子节点
closed_list = [] # 存储已找到且被扩展的子节点
BFS_node(open_list[0])

总结

主要是用广度优先遍历的思想和树结构,当然如果不在意找到4品脱的水的路径,其实没必要使用树结构。另外打印函数是从最后一层依次往上回溯的,所以显示的是倒序的路径。如果需要变成正向的话,可以加一个栈来实现。

到此这篇关于python实现三壶谜题的示例详解的文章就介绍到这了,更多相关python三壶谜题内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
在服务器端实现无间断部署Python应用的教程
Apr 16 Python
python提取字典key列表的方法
Jul 11 Python
解析Python编程中的包结构
Oct 25 Python
numpy中实现二维数组按照某列、某行排序的方法
Apr 04 Python
Python实现的线性回归算法示例【附csv文件下载】
Dec 29 Python
Python实现 PS 图像调整中的亮度调整
Jun 28 Python
python gdal安装与简单使用
Aug 01 Python
pycharm 2019 最新激活方式(pycharm破解、激活)
Sep 22 Python
Django与pyecharts结合的实例代码
May 13 Python
python3 中时间戳、时间、日期的转换和加减操作
Jul 14 Python
Django修改app名称和数据表迁移方案实现
Sep 17 Python
python调用ffmpeg命令行工具便捷操作视频示例实现过程
Nov 01 Python
python 实现批量图片识别并翻译
Nov 02 #Python
基于python实现百度语音识别和图灵对话
Nov 02 #Python
用python进行视频剪辑
Nov 02 #Python
如何通过python实现IOU计算代码实例
Nov 02 #Python
Opencv常见图像格式Data Type及代码实例
Nov 02 #Python
Jupyter安装链接aconda实现过程图解
Nov 02 #Python
详解Python3.8+PyQt5+pyqt5-tools+Pycharm配置详细教程
Nov 02 #Python
You might like
PHP 截取字符串 分别适合GB2312和UTF8编码情况
2009/02/12 PHP
PHP中最容易忘记的一些知识点总结
2013/04/28 PHP
php变量与字符串的增删改查操作示例
2020/05/07 PHP
PHP safe_mode开启对于PHP系统函数有什么影响
2020/11/10 PHP
jQuery ui 1.7更新小结
2009/08/15 Javascript
jQuery代码优化 选择符篇
2011/11/01 Javascript
jquery的flexigrid无法显示数据提示获取到数据
2013/07/19 Javascript
使用node.js半年来总结的 10 条经验
2014/08/18 Javascript
JavaScript让网页出现渐隐渐显背景颜色的方法
2015/04/21 Javascript
jQuery计算文本框字数及限制文本框字数的方法
2016/03/01 Javascript
使用postMesssage()实现iframe跨域页面间的信息传递
2016/03/29 Javascript
VUE2实现事件驱动弹窗示例
2017/10/21 Javascript
微信小程序获取手机网络状态的方法【附源码下载】
2017/12/08 Javascript
Gulp实现静态网页模块化的方法详解
2018/01/09 Javascript
微信小程序实现天气预报功能
2018/07/18 Javascript
Vue头像处理方案小结
2018/07/26 Javascript
Vue项目使用localStorage+Vuex保存用户登录信息
2019/05/27 Javascript
Vue使用vue-draggable 插件在不同列表之间拖拽功能
2020/03/12 Javascript
Vue向后台传数组数据,springboot接收vue传的数组数据实例
2020/11/12 Javascript
Python的Flask框架中实现简单的登录功能的教程
2015/04/20 Python
编写Python脚本来获取mp3文件tag信息的教程
2015/05/04 Python
Python实现计算最小编辑距离
2016/03/17 Python
利用Python3分析sitemap.xml并抓取导出全站链接详解
2017/07/04 Python
python 实现批量xls文件转csv文件的方法
2018/10/23 Python
python对Excel按条件进行内容补充(推荐)
2019/11/24 Python
python学习笔记之多进程
2020/08/06 Python
利用Python将图片中扭曲矩形的复原
2020/09/07 Python
电子信息工程专业推荐信
2014/02/14 职场文书
《李时珍夜宿古寺》教学反思
2014/04/09 职场文书
公司募捐倡议书
2014/05/14 职场文书
十佳好少年事迹材料
2014/08/21 职场文书
求职导师推荐信范文
2015/03/27 职场文书
公司仓管员岗位职责
2015/04/01 职场文书
实践论读书笔记
2015/06/29 职场文书
opencv读取视频并保存图像的方法
2021/06/04 Python
Go语言并发编程 sync.Once
2021/10/16 Golang