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中的zip函数使用示例
Jan 29 Python
Python进行数据科学工作的简单入门教程
Apr 01 Python
python版本的读写锁操作方法
Apr 25 Python
django中的setting最佳配置小结
Nov 21 Python
Python3实现的字典、列表和json对象互转功能示例
May 22 Python
Python实现对文件进行单词划分并去重排序操作示例
Jul 10 Python
十个Python练手的实战项目,学会这些Python就基本没问题了(推荐)
Apr 26 Python
Python静态类型检查新工具之pyright 使用指南
Apr 26 Python
详解Python 字符串相似性的几种度量方法
Aug 29 Python
Python多继承以及MRO顺序的使用
Nov 11 Python
Python 实现使用空值进行赋值 None
Mar 12 Python
python 利用Pyinstaller打包Web项目
Oct 23 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正则表达匹配中文问题分析小结
2012/03/25 PHP
apache php mysql开发环境安装教程
2016/07/28 PHP
Thinkphp5框架使用validate实现验证功能的方法
2019/08/27 PHP
form中限制文本字节数js代码
2007/06/10 Javascript
JQuery textlimit 显示用户输入的字符数 限制用户输入的字符数
2009/05/14 Javascript
JavaScript实现页面实时显示当前时间的简单实例
2013/07/20 Javascript
关于jquery中全局函数each使用介绍
2013/12/10 Javascript
jQuery中data()方法用法实例
2014/12/27 Javascript
JavaScript子窗口调用父窗口变量和函数的方法
2015/10/09 Javascript
js倒计时简单实现方法
2015/12/17 Javascript
Backbone中View之间传值的学习心得
2016/08/09 Javascript
AngularJS extend用法详解及实例代码
2016/11/15 Javascript
div中文字内容溢出常见的解决方法
2017/03/16 Javascript
webpack多入口文件页面打包配置详解
2018/01/09 Javascript
vue插槽slot的简单理解与用法实例分析
2020/03/14 Javascript
js 数组当前行添加数据方法详解
2020/07/28 Javascript
解决vue watch数据的方法被调用了两次的问题
2020/11/07 Javascript
[14:25]教你分分钟做大人:主宰(HEROS)
2014/12/08 DOTA
python实现的一个火车票转让信息采集器
2014/07/09 Python
Python2.x中文乱码问题解决方法
2015/06/02 Python
实例探究Python以并发方式编写高性能端口扫描器的方法
2016/06/14 Python
利用Python将时间或时间间隔转为ISO 8601格式方法示例
2017/09/05 Python
Anaconda2下实现Python2.7和Python3.5的共存方法
2018/06/11 Python
matplotlib实现显示伪彩色图像及色度条
2019/12/07 Python
Python制作简易版小工具之计算天数的实现思路
2020/02/13 Python
Python matplotlib读取excel数据并用for循环画多个子图subplot操作
2020/07/14 Python
python如何建立全零数组
2020/07/19 Python
CSS3径向渐变之大鱼吃小鱼之孤单的大鱼
2016/04/26 HTML / CSS
Marks & Spencer爱尔兰:英国马莎百货
2016/04/20 全球购物
英国潮流网站:END.(全球免邮)
2017/01/16 全球购物
Shein英国:女性时尚网上商店
2019/04/10 全球购物
建筑经济管理专业求职信分享
2014/01/06 职场文书
眼镜促销方案
2014/03/15 职场文书
买房委托公证书
2014/04/08 职场文书
投资协议书范本
2014/04/21 职场文书
预备党员综合考察材料
2014/05/31 职场文书