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 布尔操作实现代码
Mar 23 Python
Python有序字典简单实现方法示例
Sep 28 Python
Pycharm使用之设置代码字体大小和颜色主题的教程
Jul 12 Python
python 修改本地网络配置的方法
Aug 14 Python
python并发编程 Process对象的其他属性方法join方法详解
Aug 20 Python
关于python pycharm中输出的内容不全的解决办法
Jan 10 Python
python 最简单的实现适配器设计模式的示例
Jun 30 Python
pandas参数设置的实用小技巧
Aug 23 Python
Python自动登录QQ的实现示例
Aug 28 Python
Pycharm自动添加文件头注释和函数注释参数的方法
Oct 23 Python
Python基于execjs运行js过程解析
Nov 27 Python
pytorch model.cuda()花费时间很长的解决
Jun 01 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+ACCESS 文章管理程序代码
2010/06/21 PHP
destoon整合ucenter后注册页面不跳转的解决方法
2014/06/21 PHP
php图像处理类实例
2015/07/28 PHP
php中二维数组排序问题方法详解
2015/08/28 PHP
php+jquery+html实现点击不刷新加载更多的实例代码
2016/08/12 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
php处理抢购类功能的高并发请求
2018/02/08 PHP
php快速导入大量数据的实例方法
2019/09/23 PHP
提高 DHTML 页面性能
2006/12/25 Javascript
JS定时刷新页面及跳转页面的方法
2013/07/04 Javascript
Vuejs第十三篇之组件——杂项
2016/09/09 Javascript
Bootstrap导航简单实现代码
2017/03/06 Javascript
妙用Angularjs实现表格按指定列排序
2017/06/23 Javascript
使用JavaScript实现alert的实例代码
2017/07/06 Javascript
微信小程序使用radio显示单选项功能【附源码下载】
2017/12/11 Javascript
webpack 4.0.0-beta.0版本新特性介绍
2018/02/10 Javascript
解决vue单页使用keep-alive页面返回不刷新的问题
2018/03/13 Javascript
vue better scroll 无法滚动的解决方法
2018/06/07 Javascript
Vue-router 切换组件页面时进入进出动画方法
2018/09/01 Javascript
vue解决一个方法同时发送多个请求的问题
2018/09/25 Javascript
eslint 的三大通用规则详解
2019/05/16 Javascript
jQuery实现验证用户登录
2019/12/10 jQuery
[01:15:44]首部DOTA2纪录片今日23时全网上映
2014/03/19 DOTA
python使用if语句实现一个猜拳游戏详解
2019/08/27 Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
2019/10/17 Python
Python提取视频中图片的示例(按帧、按秒)
2020/10/22 Python
Python 内存管理机制全面分析
2021/01/16 Python
HTML5实现获取地理位置信息并定位功能
2015/04/25 HTML / CSS
有750多个顶级品牌的瑞士时尚在线:ABOUT YOU
2017/01/04 全球购物
Nordgreen手表德国官方网站:丹麦极简主义手表
2019/10/31 全球购物
事业单位个人应聘自荐信
2013/09/21 职场文书
解除劳动合同协议书
2014/04/14 职场文书
2014年保险公司工作总结
2014/11/22 职场文书
2015新学期家长寄语
2015/02/26 职场文书
java解析XML详解
2021/07/09 Java/Android
关于MySQL中explain工具的使用
2023/05/08 MySQL