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 元类使用说明
Dec 18 Python
Python HTMLParser模块解析html获取url实例
Apr 08 Python
Python生成密码库功能示例
May 23 Python
python向已存在的excel中新增表,不覆盖原数据的实例
May 02 Python
python GUI图形化编程wxpython的使用
Jul 19 Python
python使用pip安装模块出现ReadTimeoutError: HTTPSConnectionPool的解决方法
Oct 04 Python
python 利用jinja2模板生成html代码实例
Oct 10 Python
python中_del_还原数据的方法
Dec 09 Python
如何用Python提取10000份log中的产品信息
Jan 14 Python
通用的Django注册功能模块实现方法
Feb 05 Python
Python的collections模块真的很好用
Mar 01 Python
利用python实时刷新基金估值(摸鱼小工具)
Sep 15 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
暴雪前总裁遗憾:没尽早追赶Dota 取消星际争霸幽灵
2020/03/08 星际争霸
PHP 长文章分页函数 带使用方法,不会分割段落,翻页在底部
2009/10/22 PHP
js+FSO遍历文件夹下文件并显示
2007/03/07 Javascript
javascript  Error 对象 错误处理
2008/05/18 Javascript
JavaScript Date对象使用总结
2009/05/14 Javascript
JavaScript 创建对象
2009/07/17 Javascript
分享一个用Mootools写的鼠标滑过进度条改变进度值的实现代码
2011/12/12 Javascript
jquery获取iframe中的dom对象(两种方法)
2013/07/02 Javascript
浅析onsubmit校验表单时利用ajax的return false无效问题
2013/07/10 Javascript
IE8的JavaScript点击事件(onclick)不兼容的解决方法
2013/11/22 Javascript
详解通过JSON数据使用VUE.JS
2017/05/26 Javascript
JS+CSS实现网页加载中的动画效果
2017/10/27 Javascript
原生javascript AJAX 三级联动的实现代码
2018/05/04 Javascript
Angularjs实现页面模板清除的方法
2018/07/20 Javascript
详解jQuery获取特殊属性的值以及设置内容
2018/11/14 jQuery
微信小程序(订阅消息)功能
2019/10/25 Javascript
Python的Tornado框架实现异步非阻塞访问数据库的示例
2016/06/30 Python
python 3.3 下载固定链接文件并保存的方法
2018/12/18 Python
深度辨析Python的eval()与exec()的方法
2019/03/26 Python
Python3.5 Pandas模块之DataFrame用法实例分析
2019/04/23 Python
opencv-python 读取图像并转换颜色空间实例
2019/12/09 Python
20行Python代码实现一款永久免费PDF编辑工具的实现
2020/08/27 Python
Python实现微信表情包炸群功能
2021/01/28 Python
纯CSS3实现3D旋转书本效果
2016/03/21 HTML / CSS
HTML5 绘制图像(上)之:关于canvas元素引领下一代web页面的问题
2013/04/24 HTML / CSS
Otticanet英国:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/02/10 全球购物
Dyson戴森波兰官网:Dyson.pl
2019/08/05 全球购物
印度在线购买电子产品网站:Croma
2020/01/02 全球购物
程序员机试试题汇总
2012/03/07 面试题
高一英语教学反思
2014/01/22 职场文书
工厂总经理岗位职责
2014/02/07 职场文书
婚前协议书怎么写
2014/04/15 职场文书
学校综治宣传月活动总结
2014/07/02 职场文书
入党积极分子批评与自我批评思想汇报
2014/09/14 职场文书
优秀教育工作者事迹材料
2014/12/24 职场文书
2015新教师教学工作总结
2015/07/22 职场文书