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 Mysql自动备份脚本
Jul 14 Python
Python使用struct处理二进制的实例详解
Sep 11 Python
Python日志模块logging基本用法分析
Aug 23 Python
Python Pandas批量读取csv文件到dataframe的方法
Oct 08 Python
Numpy之将矩阵拉成向量的实例
Nov 30 Python
pytorch逐元素比较tensor大小实例
Jan 03 Python
python实现Pyecharts实现动态地图(Map、Geo)
Mar 25 Python
Tensorflow中批量读取数据的案列分析及TFRecord文件的打包与读取
Jun 30 Python
Python接口自动化测试的实现
Aug 28 Python
Numpy中np.max的用法及np.maximum区别
Nov 27 Python
Python 获取异常(Exception)信息的几种方法
Dec 29 Python
Python 中的Sympy详细使用
Aug 07 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中filter函数校验数据的方法详解
2015/07/31 PHP
php7下的filesize函数
2019/09/30 PHP
使用JavaScript库还是自己写代码?
2010/01/28 Javascript
Jsonp 跨域的原理以及Jquery的解决方案
2010/05/18 Javascript
只需20行代码就可以写出CSS覆盖率测试脚本
2013/04/24 Javascript
jquery入门必备的基本认识及实例(整理)
2013/06/24 Javascript
JS模拟实现Select效果代码
2015/09/24 Javascript
jQuery中的each()详细介绍(推荐)
2016/05/25 Javascript
jQuery基于ID调用指定iframe页面内的方法
2016/07/06 Javascript
xmlplus组件设计系列之选项卡(Tabbar)(5)
2017/05/03 Javascript
layer弹窗在键盘按回车将反复刷新的实现方法
2019/09/25 Javascript
JavaScript canvas仿代码流瀑布
2020/02/10 Javascript
Vue2.x-使用防抖以及节流的示例
2021/03/02 Vue.js
归纳整理Python中的控制流语句的知识点
2015/04/14 Python
python3实现公众号每日定时发送日报和图片
2018/02/24 Python
Python处理命令行参数模块optpars用法实例分析
2018/05/31 Python
远程部署工具Fabric详解(支持Python3)
2019/07/04 Python
利用python、tensorflow、opencv、pyqt5实现人脸实时签到系统
2019/09/25 Python
python网络编程socket实现服务端、客户端操作详解
2020/03/24 Python
使用Python三角函数公式计算三角形的夹角案例
2020/04/15 Python
Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow
2020/04/20 Python
Django models文件模型变更错误解决
2020/05/11 Python
Python调用JavaScript代码的方法
2020/10/27 Python
Python可以用来做什么
2020/11/23 Python
详解CSS3 Media Queries中媒体属性的使用
2016/02/29 HTML / CSS
Lovedrobe官网:英国领先的大码服装品牌
2019/09/19 全球购物
GWT都有什么特性
2016/12/02 面试题
财务会计专业毕业生自荐信
2013/10/19 职场文书
道德之星事迹材料
2014/05/03 职场文书
国旗下的讲话演讲稿
2014/05/08 职场文书
应届毕业生自荐书
2014/06/18 职场文书
科级干部群众路线教育实践活动个人对照检查材料
2014/09/19 职场文书
Python一些基本的图像操作和处理总结
2021/06/23 Python
详解nginx安装过程并代理下载服务器文件
2022/02/12 Servers
Spring Security使用单点登录的权限功能
2022/04/03 Java/Android