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 相关文章推荐
用PyQt进行Python图形界面的程序的开发的入门指引
Apr 14 Python
python比较2个xml内容的方法
May 11 Python
详谈pandas中agg函数和apply函数的区别
Apr 20 Python
Python3 获取一大段文本之间两个关键字之间的内容方法
Oct 11 Python
对Python生成汉字字库文字,以及转换为文字图片的实例详解
Jan 29 Python
在Django model中设置多个字段联合唯一约束的实例
Jul 17 Python
python scipy卷积运算的实现方法
Sep 16 Python
Python使用__new__()方法为对象分配内存及返回对象的引用示例
Sep 20 Python
win10下opencv-python特定版本手动安装与pip自动安装教程
Mar 05 Python
利用 PyCharm 实现本地代码和远端的实时同步功能
Mar 23 Python
Python实现弹球小游戏
Aug 01 Python
细说NumPy数组的四种乘法的使用
Dec 18 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
神族 Protoss 剧情介绍
2020/03/14 星际争霸
第八节 访问方式 [8]
2006/10/09 PHP
Yii2简单实现给表单添加验证码的方法
2016/07/18 PHP
google地图的路线实现代码
2009/08/20 Javascript
js设置文本框中焦点位置在最后的示例代码(简单实用)
2014/03/04 Javascript
JS实现两个大数(整数)相乘
2014/04/28 Javascript
jQuery实现带延迟的二级tab切换下拉列表效果
2015/09/01 Javascript
浅谈JS中json数据的处理
2016/06/30 Javascript
微信jssdk用法汇总
2016/07/16 Javascript
react系列从零开始_简单谈谈react
2017/07/06 Javascript
Vue.js 点击按钮显示/隐藏内容的实例代码
2018/02/08 Javascript
使用JavaScript计算前一天和后一天的思路详解
2019/12/20 Javascript
vue学习之Vue-Router用法实例分析
2020/01/06 Javascript
javascript设计模式 ? 代理模式原理与用法实例分析
2020/04/16 Javascript
vue中template的三种写法示例
2020/10/21 Javascript
Python装饰器基础详解
2016/03/09 Python
Python3 加密(hashlib和hmac)模块的实现
2017/11/23 Python
Python 中导入csv数据的三种方法
2018/11/01 Python
python3.6+selenium实现操作Frame中的页面元素
2019/07/16 Python
Matlab中plot基本用法的具体使用
2020/07/17 Python
详解Python 最短匹配模式
2020/07/29 Python
python 深度学习中的4种激活函数
2020/09/18 Python
全球速卖通西班牙站:AliExpress西班牙
2017/10/30 全球购物
在C语言中实现抽象数据类型什么方法最好
2014/06/26 面试题
新闻专业应届生求职信
2013/10/31 职场文书
运动会跳远加油稿
2014/02/20 职场文书
护士求职自荐信范文
2014/03/19 职场文书
理想点亮人生演讲稿
2014/05/21 职场文书
和谐社区口号
2014/06/19 职场文书
2014年班主任德育工作总结
2014/12/05 职场文书
金秋助学感谢信
2015/01/21 职场文书
vue中三级导航的菜单权限控制
2021/03/31 Vue.js
MySQL 角色(role)功能介绍
2021/04/24 MySQL
Python使用OpenCV实现虚拟缩放效果
2022/02/28 Python
浅谈Redis 中的过期删除策略和内存淘汰机制
2022/04/03 Redis
Python使用mitmproxy工具监控手机 下载手机小视频
2022/04/18 Python