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 django集成cas验证系统
Jul 14 Python
编写简单的Python程序来判断文本的语种
Apr 07 Python
Python验证码识别处理实例
Dec 28 Python
Python 使用requests模块发送GET和POST请求的实现代码
Sep 21 Python
Python标准库之collections包的使用教程
Apr 27 Python
matplotlib绘制符合论文要求的图片实例(必看篇)
Jun 02 Python
Python中表示字符串的三种方法
Sep 06 Python
Python + OpenCV 实现LBP特征提取的示例代码
Jul 11 Python
pycharm通过ssh连接远程服务器教程
Feb 12 Python
Python多进程编程multiprocessing代码实例
Mar 12 Python
Django 解决新建表删除后无法重新创建等问题
May 21 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
Oct 26 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
如何开始收听短波广播
2021/03/01 无线电
印尼林东PWN黄金曼特宁咖啡豆:怎么冲世界上最醇厚的咖啡冲煮教程
2021/03/03 冲泡冲煮
PHP仿博客园 个人博客(2) 数据库增添改删
2013/07/05 PHP
php开发工具有哪五款
2015/11/09 PHP
php for 循环使用的简单实例
2016/06/02 PHP
jQuery Div中加载其他页面的实现代码
2009/02/27 Javascript
图片onload事件触发问题解决方法
2011/07/31 Javascript
js借助ActiveXObject实现创建文件
2013/09/29 Javascript
利用jQuery实现可输入搜索文字的下拉框
2013/10/23 Javascript
JS字符串截取函数实例
2013/12/27 Javascript
写出高效jquery代码的19条指南
2014/03/19 Javascript
jsPDF导出pdf示例
2014/05/02 Javascript
浅谈JavaScript的Polymer框架中的behaviors对象
2015/07/29 Javascript
JavaScript面向对象之私有静态变量实例分析
2016/01/14 Javascript
使用Bootstrap typeahead插件实现搜索框自动补全的方法
2016/07/07 Javascript
JavaScript生成.xls文件的代码
2016/12/22 Javascript
bootstrap插件treeview实现全选父节点下所有子节点和反选功能
2017/07/21 Javascript
vue 导航菜单刷新状态不消失,显示对应的路由界面操作
2020/08/06 Javascript
[04:54]DOTA2 2017国际邀请赛:上届冠军WINGS采访短片
2017/08/09 DOTA
python从入门到精通(DAY 2)
2015/12/20 Python
Python的Flask框架应用程序实现使用QQ账号登录的方法
2016/06/07 Python
python3+PyQt5实现使用剪贴板做复制与粘帖示例
2017/01/24 Python
django创建自定义模板处理器的实例详解
2017/08/14 Python
python爬虫获取淘宝天猫商品详细参数
2020/06/23 Python
解决安装pyqt5之后无法打开spyder的问题
2019/12/13 Python
关于Pytorch的MLP模块实现方式
2020/01/07 Python
HTML5 Web缓存和运用程序缓存(cookie,session)
2018/01/11 HTML / CSS
基于HTML5+tracking.js实现刷脸支付功能
2020/04/16 HTML / CSS
销售行政专员职责
2014/01/03 职场文书
个人批评与自我批评范文
2014/10/17 职场文书
2014年工程部工作总结
2014/11/25 职场文书
2015关于重阳节的演讲稿
2015/03/20 职场文书
调解书格式范本
2015/05/20 职场文书
实习指导老师意见
2015/06/04 职场文书
2015年暑假工作总结
2015/07/13 职场文书
导游词之山西-五老峰
2019/10/07 职场文书