三个水桶等分8升水的问题 -《算法的乐趣》

智力题目

有三个容积分别为3升、5升、8升的水桶,其中容积为8升的水桶中装满了水,容积为3升和容积为5升的水桶都是空的。三个水桶都没有刻度,现在需要将大水桶中的8升水等分成两份,每份都是4升水,附加条件是只能这三个水桶,不能借助其他辅助容器。

“恩,是的,这是一个很经典的问题。”

“然而,我们并不能想全,不信请继续往下看。”
答案

”废话不多说,直接看方法吧。“
第一种(7步)

将8L的水桶中的水,倒满5L的水桶,这时:8L水桶为3L、5L水桶为5L、3L水桶为0L

将5L的水桶中的水,倒满3L的水桶,这时:8L水桶为3L、5L水桶为2L、3L水桶为3L

将3L的水桶中的水,倒入8L的水桶,这时:8L水桶为6L、5L水桶为2L、3L水桶为0L

将5L的水桶中的水,倒入3L的水桶,这时:8L水桶为6L、5L水桶为0L、3L水桶为2L

将8L的水桶中的水,倒入5L的水桶,这时:8L水桶为1L、5L水桶为5L、3L水桶为2L

将5L的水桶中的水,倒满3L的水桶,这时:8L水桶为1L、5L水桶为4L、3L水桶为3L

将3L的水桶中的水,倒入8L的水桶,这时:8L水桶为4L、5L水桶为4L、3L水桶为0L

第二种(8步)

将8L的水桶中的水,倒满3L的水桶,这时:8L水桶为5L、5L水桶为0L、3L水桶为3L

将3L的水桶中的水,倒入5L的水桶,这时:8L水桶为5L、5L水桶为3L、3L水桶为0L

将8L的水桶中的水,倒满3L的水桶,这时:8L水桶为2L、5L水桶为3L、3L水桶为3L

将3L的水桶中的水,倒满5L的水桶,这时:8L水桶为2L、5L水桶为5L、3L水桶为1L

将5L的水桶中的水,倒入8L的水桶,这时:8L水桶为7L、5L水桶为0L、3L水桶为1L

将3L的水桶中的水,倒入5L的水桶,这时:8L水桶为7L、5L水桶为1L、3L水桶为0L

将8L的水桶中的水,倒满3L的水桶,这时:8L水桶为4L、5L水桶为1L、3L水桶为3L

将3L的水桶中的水,倒入5L的水桶,这时:8L水桶为4L、5L水桶为4L、3L水桶为0L

我相信答案肯定不止两个,到底有多少种答案?

带着这个疑问,我们来设计一个算法吧。
问题分析
人的思维

解决这个问题的关键是怎么通过倒水凑出确定的1升水或能容纳1升水的空间。

例如,当8L水桶或5L水桶或3L水桶有1L水时,都能快速倒出4L水。
计算机思维

“穷举法”

水桶初始状态:8L水桶装满水,3L和5L的水桶为空。 水桶最终状态:3L水桶为空,5L和8L的水桶各4L水。

假设将每个状态下三个水桶中的水的体积作为status。

从 $status = array(8,0,0) 得到 $status = array(4,4,0)。

当然还会有一些限制:

1.各个水桶的都有最大值:

0 <= status[0] <= 8;

0 <= status[1] <= 5;

0 <= status[2] <= 3;

2.当前倒水之后各个水桶的状态,与历史倒水之后各个水桶的状态,不能相同。

3.当前水桶为空时,不能倒给其他水桶。

4.当前水桶为最大容积时,其他水桶不能再向这个水桶倒水。
程序代码(PHP)

运行结果

一共有 16 种倒水方法,方法如下:

...

(16种方法,贴上去太长了,大家在本地尝试下,如需要源码,请关注公众号进行留言。)
小结

运行代码之后,一共找到了 16 种倒水的方法,最快的方法需要 7 个步骤。

“怎么样,是不是没想到会有这么多方法吧,去考考你身边的小伙伴吧。”

原文地址:https://www.cnblogs.com/it-3327/p/11823637.html

时间: 2024-10-11 21:29:19

三个水桶等分8升水的问题 -《算法的乐趣》的相关文章

三个水桶等分8升水的问题

问题描述: 有三个容积分别为8升.5升.3升的水桶,其中容积为8升的水桶盛满了水,容积为5升和3升的水桶都是空的.三个水桶都没有刻度,现在需要将水桶中的8升水等分成2份,每份都是4升水.条件是只能使用这三个水桶,不能借助其他工具. 问题分析: 对于这个问题,似乎没有“规律”可循,没有专门的算法来求解,因此只能尝试使用“穷举法”来求解. 把每个状态下三个水桶中的水的体积作为status,例如status = array(8,0,0),想要得到的status = array(4,4,0). 这样,就

取3升水

1.题目:假设有一个池塘,里面有足够多的水.现有容积分别为5升和6升的2个空水壶,问题:如何用这2个水壶从池塘里取得3升的水? 方法一:1.5升的水壶装满水     2.将5升水壶的水倒入6升的水壶     3.5升的水壶再装满水     4.用5升水壶的水将6升的水壶倒满,此时5升的水壶里剩下4升水     5.将6升的水壶清空,把5升水壶里剩下的4升水倒入6升的水壶     6.5升的水壶再装满水,然后将6升的水壶倒满,此时5升的水壶里剩下3升水. 方法二:1.6升的水壶装满水      2

Grass Gis 峡谷堰塞湖预测模型r.lake剖析--湖心灌水洪泛算法

Grass Gis 是20世纪80年代初,美国军方建筑工程研究实验室(USA/CERL)的Bill Gorgan负责遴选一款具有土地管理.环境规划.环境评估的GIS软件.它有400多个地质分析模块,今天我们剖析一下r.lake算法. 1. 堰塞湖预测建模r.lake能做什么 如下图1左为一张地形栅格图,也是最常见的2D平面图.从图中可以看到许多的凹地盆地,当有山洪暴雨时就会形成堰塞湖. Grass Gis 的r.lake就是能够预测堰塞湖形状大小的模块.例如,在图1左所示的红色圆圈位置开始注水当

区块链快速入门(三)——CFT(非拜占庭容错)共识算法

区块链快速入门(三)--CFT(非拜占庭容错)共识算法 一.CFT简介 CFT(Crash Fault Tolerance),即故障容错,是非拜占庭问题的容错技术.Paxos 问题是指分布式的系统中存在故障(crash fault),但不存在恶意(corrupt)节点的场景(即可能消息丢失或重复,但无错误消息)下的共识达成问题,是分布式共识领域最为常见的问题.最早由Leslie Lamport用 Paxon 岛的故事模型来进行描述而得以命名.解决Paxos问题的算法主要有Paxos系列算法和Ra

某某水卡数据算法

## 第一张卡-----------------------------金额 | 扇区数据:--- |:---56.77 | 3C 48 2D 16 05 B7 00 00 00 02 02 00 00 FD 00 B756.65 | 35 37 21 16 00 C8 00 00 00 02 02 00 00 FD 00 C856.15 | F8 04 EF 15 00 FB 00 00 00 02 02 00 00 FD 00 FB56.00 | F7 F5 E0 15 00 0A 00 0

hdu 1233 还是畅通工程 水题~~~~~~~~~kruskal算法AC

还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 28355    Accepted Submission(s): 12674 Problem Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路

给三个int,判断是否可构成三角形算法

哎,今天跟同事讨论算法,有一个女生给我出了这样一个题目,bool Test(int a,int b,int c)感觉很简单,实际呢?自己考虑的不够全面.在得到了提示之后呢,也还是找不到很好的解决方案.我是有多菜已经懒得再提了,只是今天遇到了,不能保证以后不会遇到.对于我这种脑袋很简单的童鞋,只能在积累中逐渐成长了.短期内,遇到什么算法题,自己先思考,然后呢,看看别人的最优解跟自己的差距.不能光有嘴把式,还要有真把式,我要求自己,再简单的算法,也都必须自己实现一下,看一遍记不住,就看一百遍,背也要

程序员是否必须会算法

本章的标题既然是"程序员与算法",就必然要涉及一个基本问题,那就是"程序员是否必须会算法".这是一个充满争议的问题,虽然并不像"生存还是毁灭"之类的选择那样艰难而沉重,但也绝不是一个轻松的话题.朋友们在我的"算法系列"博客专栏上发表的评论和回复,并不都是我所期待的赞美和鼓励,也常常会有一些冷言冷语.比如,"穷举也算是算法吗"或者"请你说明一下算法在XX系统中能起到什么作用". 有一次,一

CodeM-II-3

有一个大水缸,里面水的温度为T单位,体积为C升.另有n杯水(假设每个杯子的容量是无限的),每杯水的温度为t[i]单位,体积为c[i]升.现在要把大水缸的水倒入n杯水中,使得n杯水的温度相同,请问这可能吗?并求出可行的最高温度,保留4位小数. 注意:一杯温度为t1单位.体积为c1升的水与另一杯温度为t2单位.体积为c2升的水混合后,温度变为(t1*c1+t2*c2)/(c1+c2),体积变为c1+c2. 输入描述: 第一行一个整数n, 1 ≤ n ≤ 10^5 第二行两个整数T,C,其中0 ≤ T