算法分析-三壶谜题

news2024/9/21 12:33:49

一.题目需求

有一个充满水的8品脱的水壶和两个空水壶(容积分别是5品脱和3品脱)。
通过将水壶完全倒满水和将水壶的水完全倒空这两种方式,在其中的一个水壶中得到4品脱的水。

二、算法思想

1.算法分析
1.1. 采用的算法思想是将某个时刻水壶中水的数量看作一个状态,用一个长度为3的数组表示。
1.2. 初始状态便为[8,0,0],再拓展他的下一结点的可能结构。
1.3. 若下一结点的结构已经被拓展过了便放弃,若没有拓展过则加入拓展列表(new_list)中。然后递归上述操作。
1.4. 直到拓展列表(new_list)为空或者找到目标为止。

2.思想图解
这里的第一个数就代表着是那个8品脱的瓶子,依次分别是8品脱,5品脱,3品脱。

就如图一样,使用广度优先遍历(类似于层次遍历)一次一次递归扩展新的结点,知道找到4品脱的水或者无结点可扩展为止。


三、代码展示
1.创建树节点结构
节点包括两个属性,一个属性是数组类型的,存储当前三个水壶的容量状态,另一个属性是记录它是由哪个结点扩展过来的,以便找到解决路径:

2.实现倒水动作
由于这里只有三个壶,互相倾倒的方案可以枚举出来,所有我就没使用二重嵌套循环,而是使用一层循环:

这个算法的时间复杂度是O(n^2)。

时间复杂度分析:
2.1. 外层循环有6次,每次循环中都会进行一次内层循环,内层循环最多有6次。所以总共会进行36次循环。
2.2. 在内层循环中,有一个判断语句,用于检查当前的n_list状态是否已经被考虑过。这个判断语句的时间复杂度是O(n),因为它需要遍历old_list列表。
2.3. 因此,总的时间复杂度是O(6 * 36 * n) = O(n^2)。


3.广度优先遍历
主要算法:使用广度优先遍历算法(层次遍历算法)一次一次递归扩展新的结点,知道找到4品脱的水或者无结点可扩展为止:

这个算法是广度优先遍历(BFS)的实现。它从一个根节点开始,然后访问所有相邻的节点,然后再访问这些节点的相邻节点,以此类推。

这个过程会一直持续到没有更多的节点可以访问为止。


时间复杂度分析:
1. 初始化两个列表 old_list 和 new_list,它们的大小取决于树的宽度。在最坏的情况下,树可能是一个线性结构,即每个节点只有一个子节点。在这种情况下,new_list 的大小将等于树的宽度,即 O(n),其中 n 是树的节点数。
2. while 循环会执行直到 new_list 为空。在每次迭代中,它会从 new_list 中弹出一个节点,并将其添加到 old_list 中。这个过程的时间复杂度是 O(1)。由于 while 循环会执行 n 次,所以总的时间复杂度是 O(n)。
3. 在每次迭代中,还会调用 pour 函数来处理当前节点的状态。pour 倒水函数的时间复杂度是 O(n^2),那么总的时间复杂度将是 O(n)*O(n^2)。
综上所述,这个算法的时间复杂度是 O(n^3)。

4.实现主函数

5.运行结果
从运行结果可以看出,遍历到第7步即可得到含有4品脱的水壶。
 

==========结束==========

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1238255.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Newman+Jenkins实现自动化测试

一、是什么Newman Newman就是纽曼手机这个经典牌子,哈哈,开玩笑啦。。。别当真,简单地说Newman就是命令行版的Postman,查看官网地址。 Newman可以使用Postman导出的collection文件直接在命令行运行,把Postman界面化运…

材料电磁参数综合测试解决方案-材料电磁参数测试系统 (100MHz-500GHz)

材料电磁参数测试系统 100MHz-500GHz 材料电磁参数测试系统测试频率范围覆盖100MHz~500GHz,可实现材料复介电常数、复磁导率等参数测试。系统由矢量网络分析仪、测试夹具、系统软件等组成,根据用户不同频率、材料类型的测试需求&#xff…

又一个涵盖前后端+DevOps+OpenAI大模型的高并发项目启动了

大家好,我是冰河~~ 今天,正式通知大家一件事情:又到了启动新项目的时候,这也是 冰河技术 知识星球继 Seckill秒杀系统 项目后,又一个高并发实战项目。星球其他项目与专栏,大家可移步到冰河的个人站点&…

日常工作中,软件测试人员如何避免“背锅”

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

2014年8月20日 Go生态洞察:Go在OSCON的精彩亮相

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

如何使用浏览器自动化框架Playwright开发“万媒易发”实现多平台自动发布文章?

作为一名程序员和开发者,我深知在多个媒体平台手动发布和管理文章的痛苦。因此,我决定使用Playwright浏览器自动化框架,开发一款名为“万媒易发”的工具,实现多平台自动发布文章。下面我将分享这款工具的开发过程和成果&#xff0…

网络运维与网络安全 学习笔记2023.11.22

网络运维与网络安全 学习笔记 第二十三天 今日目标 VLAN间通信之交换机、VLAN间通信综合案例、浮动路由 VRRP原理与配置、VRRP链路跟踪、VRRP安全认证 VLAN间通信之交换机 单臂路由的缺陷 在内网的VLAN数量增多时,单臂链路容易成为网络瓶颈 三层交换机 具备…

【图数据库实战】gremlin语法

Gremlin 是 Apache TinkerPop 的图遍历语言。Gremlin 是一种函数式数据流语言,使用户能够简洁地表达对其应用程序属性图的复杂遍历(或查询)。每个 Gremlin 遍历都由一系列(可能嵌套的)步骤组成。步骤对数据流执行原子操…

2014年5月28日 Go生态洞察:GopherCon 2014大会回顾

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

IO口电压下降那么多是怎么回事??

前几天一个工程师向我反馈他测得如下电路MCU IO口的电压不是3.3V,只有2V多。 IO配置的是输入功能,无上下拉。最初我不太相信这个结果,后来自己用万用表实际测量了下,还真是这个结果 这是咋回事呢?不应该电压就是3.3V吗…

阿里巴巴国际站自养号测评方式提升星级的优势与要求

作为国际站的商家,都明白星等级这个重要指标的重要性。它像一块闪耀的招牌,不仅彰显了商家的运营能力,还体现了公司的实力。维护一个高等级的星等级,可以使商家的运营工作更加轻松,而低等级则需要花费更多的精力。提升…

一起学docker系列之六如何搭建私服版本的Docker镜像仓库

目录 前言1 下载并运行私服版本的Docker镜像仓库2 准备上传私服的Docker镜像3 为镜像打上符合私服规范的标签4 修改Docker守护进程的配置文件5 推送镜像到私服版本的Docker镜像仓库6 验证私服的镜像结语 前言 Docker是一种开源的容器技术,可以让开发者和运维人员快…

每日一练 | 华为认证真题练习Day135

1、如果一个以太网数据帧的Length/Tyme0z8100,那么这个数据帧的载荷可能是?(多选) A. TCP数据段 B. UDP数据 C. ICMP报文 D. ARP报文 2、如图所示,路由器R1上部署了静态NAT命令,当PC访问互联网时&#…

ON1 Photo RAW 2024 for Mac——专业照片编辑的终极利器

ON1 Photo RAW 2024 for Mac是一款专为Mac用户打造的照片编辑器,以其强大的功能和易用的操作,让你的照片编辑工作变得轻松愉快。 一、强大的RAW处理能力 ON1 Photo RAW 2024支持大量的RAW格式照片,能够让你在编辑过程中获得更多的自由度和更…

Socket通信之网络协议基本原理

一台机器将自己想要表达的内容,按照某种约定好的格式发送出去,当另外一台机器收到这些信息后,也能够按照约定好的格式解析出来,从而准确、可靠地获得发送方想要表达的内容。这种约定好的格式就是网络协议(Networking P…

C++ 简介、基本语法、数据类型、变量、常量

一、C简介: C是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言。支持过程化编程、面向对象编程和泛型编程。C是C的一个超集,任何合法的C程序都是合法的C程序。 面向对象开发的四大特性: ◆ 封装(Encapsulat…

【转】OAK-D双目相机进行标定及标定结果说明

编辑:OAK中国 首发:A. hyhCSDN 喜欢的话,请多多👍⭐️✍ 内容来自用户的分享,如有疑问请与原作者交流! ▌前言 Hello,大家好,这里是OAK中国,我是助手君。 近期在CSDN刷…

系列十、ThreadLocal的使用场景

一、ThreadLocal的使用场景 (1)使用日期工具类,当用到SimpleDateFormat时,使用ThreadLocal保证线程安全; (2)全局存储用户信息(用户信息存入ThreadLocal,那么当前线程在任…

SSM客户管理系统CRM开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 SSM 客户管理系统CRM是一套完善的信息系统,结合springMVC框架完成本系统,对理解JSP java编程开发语言有帮助系统采用SSM框架(MVC模式开发),系统具有完整的源代码和数据库,系统主要采用B/S模…

五金零件经营小程序商城的效果如何

五金零件无论批发还是零售都有很高的需求度,传统消费者往往是线下门店寻找购买,但如今更多的客户选择线上消费,而商家们也选择线上开店拓展更广的客源及生意增长。 除了第三方平台进驻外,私域开店对商家来说也是一种方式。微信场…