php面试题 几升水,三个水桶等分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)

d6f1ffb561b90a66b601feb850670a79.png

运行结果

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

...

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

小结

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

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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值