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 相关文章推荐
在Windows8上的搭建Python和Django环境
Jul 03 Python
python通过shutil实现快速文件复制的方法
Mar 14 Python
Python中使用ElementTree解析XML示例
Jun 02 Python
Python搭建FTP服务器的方法示例
Jan 19 Python
python实现图片彩色转化为素描
Jan 15 Python
python写日志文件操作类与应用示例
Jul 01 Python
python使用多线程编写tcp客户端程序
Sep 02 Python
利用keras加载训练好的.H5文件,并实现预测图片
Jan 24 Python
tensorflow使用CNN分析mnist手写体数字数据集
Jun 17 Python
Python自定义sorted排序实现方法详解
Sep 18 Python
利用django创建一个简易的博客网站的示例
Sep 29 Python
PyTorch中clone()、detach()及相关扩展详解
Dec 09 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
Look And Say 序列php实现代码
2011/05/22 PHP
ThinkPHP3.1数据CURD操作快速入门
2014/06/19 PHP
完美的2个php检测字符串是否是utf-8编码函数分享
2014/07/28 PHP
php读取文件内容到数组的方法
2015/03/16 PHP
Laravel实现构造函数自动依赖注入的方法
2016/03/16 PHP
解决出现SoapFault (looks like we got no XML document)的问题
2017/06/24 PHP
Laravel 实现在Blade模版中使用全局变量代替路径的例子
2019/10/22 PHP
JavaScript中的标签语句用法分析
2015/02/10 Javascript
javascript删除数组重复元素的方法汇总
2015/06/24 Javascript
JS验证IP,子网掩码,网关和MAC的方法
2015/07/02 Javascript
学习Node.js模块机制
2016/10/17 Javascript
Bootstrap源码解读媒体对象、列表组和面板(10)
2016/12/26 Javascript
webpack写jquery插件的环境配置
2017/12/21 jQuery
React中常见的动画实现的几种方式
2018/01/10 Javascript
Bootstrap模态对话框用法简单示例
2018/08/31 Javascript
nodejs读取本地中文json文件出现乱码解决方法
2018/10/10 NodeJs
详解微信小程序scroll-view横向滚动的实践踩坑及隐藏其滚动条的实现
2019/03/14 Javascript
Vue数字输入框组件的使用方法
2019/10/19 Javascript
详解vue组件之间的通信
2020/08/30 Javascript
编写Python脚本抓取网络小说来制作自己的阅读器
2015/08/20 Python
Python实现批量检测HTTP服务的状态
2016/10/27 Python
python 切换root 执行命令的方法
2019/01/19 Python
PyQt打开保存对话框的方法和使用详解
2019/02/27 Python
纯python进行矩阵的相乘运算的方法示例
2019/07/17 Python
python实现在列表中查找某个元素的下标示例
2020/11/16 Python
HTML5新控件之日期和时间选择输入的实现代码
2018/09/13 HTML / CSS
英国优质家居用品网上品牌:URBANARA
2018/06/01 全球购物
某公司的.net工程师面试题笔试题
2013/11/22 面试题
Shell编程面试题
2016/05/29 面试题
农业资源与环境专业自荐信范文
2013/12/30 职场文书
优秀团员个人事迹材料
2014/01/29 职场文书
职位说明书范文
2014/05/07 职场文书
广播体操口号
2014/06/18 职场文书
2016幼儿园新学期寄语
2015/12/03 职场文书
医德医风学习心得体会
2016/01/25 职场文书
2016创先争优活动党员公开承诺书
2016/03/24 职场文书