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中的with...as用法介绍
May 28 Python
详解Python中使用base64模块来处理base64编码的方法
Jul 01 Python
Python数据结构与算法之图的广度优先与深度优先搜索算法示例
Dec 14 Python
对Python中range()函数和list的比较
Apr 19 Python
python执行CMD指令,并获取返回的方法
Dec 19 Python
python异常触发及自定义异常类解析
Aug 06 Python
wxpython绘制圆角窗体
Nov 18 Python
使用Rasterio读取栅格数据的实例讲解
Nov 26 Python
Python列表list操作相关知识小结
Jan 29 Python
Python图像处理库PIL的ImageGrab模块介绍详解
Feb 26 Python
django使用channels实现通信的示例
Oct 19 Python
python程序实现BTC(比特币)挖矿的完整代码
Jan 20 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中创建并处理图象
2006/10/09 PHP
浅谈PHP解析URL函数parse_url和parse_str
2014/11/11 PHP
PHP实现多文件上传的方法
2015/07/08 PHP
php命令行(cli)模式下报require 加载路径错误的解决方法
2015/11/23 PHP
PHP设计模式之PHP迭代器模式讲解
2019/03/22 PHP
跟我一起学写jQuery插件开发方法(附完整实例及下载)
2010/04/01 Javascript
javascript window.opener的用法分析
2010/04/07 Javascript
理解Javascript_13_执行模型详解
2010/10/20 Javascript
JavaScript表达式:URL 协议介绍
2013/03/10 Javascript
Javascript写入txt和读取txt文件示例
2014/02/12 Javascript
jquery马赛克拼接翻转效果代码分享
2015/08/24 Javascript
jquery判断当前浏览器的实现代码
2015/11/07 Javascript
基于jquery实现三级下拉菜单
2016/05/10 Javascript
浅谈Node.js:理解stream
2016/12/08 Javascript
详解angularJs指令的3种绑定策略
2017/04/13 Javascript
bootstrap-table组合表头的实现方法
2017/09/07 Javascript
js 两数组去除重复数值的实例
2017/12/06 Javascript
vue 引入公共css文件的简单方法(推荐)
2018/01/20 Javascript
[01:09:23]KG vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python中的Matplotlib模块入门教程
2015/04/15 Python
深入学习Python中的上下文管理器与else块
2017/08/27 Python
Python初学者需要注意的事项小结(python2与python3)
2018/09/26 Python
django数据模型(Model)的字段类型解析
2019/12/25 Python
Python confluent kafka客户端配置kerberos认证流程详解
2020/10/12 Python
Python 生成短8位唯一id实战教程
2021/01/13 Python
沙特阿拉伯网上购物:Sayidaty Mall
2018/05/06 全球购物
接口可以包含哪些成员
2012/09/30 面试题
医学专业毕业生求职信
2014/06/20 职场文书
小学运动会演讲稿
2014/08/25 职场文书
2014年四风问题自我剖析材料
2014/09/15 职场文书
离婚协议书范本(通用篇)
2014/11/30 职场文书
新年晚会主持词开场白
2015/05/28 职场文书
2015年小学体育教师工作总结
2015/10/23 职场文书
Python爬虫基础之爬虫的分类知识总结
2021/05/13 Python
Spring IOC容器Bean的作用域及生命周期实例
2022/05/30 Java/Android
利用Apache Common将java对象池化的问题
2022/06/16 Servers