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创建声明性迷你语言的教程
Apr 13 Python
python基础while循环及if判断的实例讲解
Aug 25 Python
深入理解Python中的super()方法
Nov 20 Python
从DataFrame中提取出Series或DataFrame对象的方法
Nov 10 Python
Django 配置多站点多域名的实现步骤
May 17 Python
Python上下文管理器全实例详解
Nov 12 Python
Python xpath表达式如何实现数据处理
Jun 13 Python
python中wheel的用法整理
Jun 15 Python
使用Keras预训练好的模型进行目标类别预测详解
Jun 27 Python
Python中logging日志记录到文件及自动分割的操作代码
Aug 05 Python
opencv python 对指针仪表读数识别的两种方式
Jan 14 Python
8g内存用python读取10文件_面试题-python 如何读取一个大于 10G 的txt文件?
May 28 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 curl 获取响应的状态码的方法
2014/01/13 PHP
PHP中header函数的用法及其注意事项详解
2016/06/13 PHP
css动画效果之animation的常用样式
2021/03/09 HTML / CSS
jquery 选项卡效果 新手代码
2011/07/08 Javascript
采用自执行的匿名函数解决for循环使用闭包的问题
2014/09/11 Javascript
使用JavaScript脚本判断页面是否在微信中被打开
2016/03/06 Javascript
jQuery实现简单弹窗遮罩效果
2017/02/27 Javascript
JavaScript使用readAsDataURL读取图像文件
2017/05/10 Javascript
Angular2生命周期钩子函数的详细介绍
2017/07/10 Javascript
js单页hash路由原理与应用实战详解
2017/08/14 Javascript
jquery 键盘事件的使用方法详解
2017/09/13 jQuery
Vue入门之数据绑定(小结)
2018/01/08 Javascript
Vue 实现双向绑定的四种方法
2018/03/16 Javascript
再谈Angular4 脏值检测(性能优化)
2018/04/23 Javascript
vue单文件组件无法获取$refs的问题
2020/06/24 Javascript
深入了解JavaScript词法作用域
2020/07/29 Javascript
[02:55]2018DOTA2国际邀请赛勇士令状不朽珍藏Ⅲ饰品一览
2018/08/01 DOTA
按日期打印Python的Tornado框架中的日志的方法
2015/05/02 Python
python编写简单爬虫资料汇总
2016/03/22 Python
python 统计代码行数简单实例
2017/05/04 Python
python学生信息管理系统(初级版)
2018/10/17 Python
Django组件之cookie与session的使用方法
2019/01/10 Python
python实现ftp文件传输功能
2020/03/20 Python
Eclipse配置python默认头过程图解
2020/04/26 Python
PyQt5的相对布局管理的实现
2020/08/07 Python
python自动化办公操作PPT的实现
2021/02/05 Python
英国复古和经典球衣网站:Vintage Football Shirts
2018/10/05 全球购物
Easy Spirit官网:美国休闲鞋履中的代表品牌
2019/04/12 全球购物
瑞典度假品牌:OAS
2019/05/28 全球购物
俄罗斯Sportmarket体育在线商店:用于旅游和户外活动
2019/11/12 全球购物
西式婚礼证婚词
2014/01/12 职场文书
幼儿园开学家长寄语
2014/01/19 职场文书
音乐教学案例
2014/01/30 职场文书
小松树教学反思
2014/02/11 职场文书
铁路安全反思材料
2014/12/24 职场文书
先进个人主要事迹怎么写
2015/11/04 职场文书