三個水桶等分8升水的問題

智力題目

有三個容積分別爲3升、5升、8升的水桶,其中容積爲8升的水桶中裝滿了水,容積爲3升和容積爲5升的水桶都是空的。三個水桶都沒有刻度,現在需要將大水桶中的8升水等分成兩份,每份都是4升水,附加條件是隻能這三個水桶,不能借助其他輔助容器。

“恩,是的,這是一個很經典的問題。”

“然而,我們並不能想全,不信請繼續往下看。”

答案

”廢話不多說,直接看方法吧。“

第一種(7步)

  1. 將8L的水桶中的水,倒滿5L的水桶,這時:8L水桶爲3L、5L水桶爲5L、3L水桶爲0L
  2. 將5L的水桶中的水,倒滿3L的水桶,這時:8L水桶爲3L、5L水桶爲2L、3L水桶爲3L
  3. 將3L的水桶中的水,倒入8L的水桶,這時:8L水桶爲6L、5L水桶爲2L、3L水桶爲0L
  4. 將5L的水桶中的水,倒入3L的水桶,這時:8L水桶爲6L、5L水桶爲0L、3L水桶爲2L
  5. 將8L的水桶中的水,倒入5L的水桶,這時:8L水桶爲1L、5L水桶爲5L、3L水桶爲2L
  6. 將5L的水桶中的水,倒滿3L的水桶,這時:8L水桶爲1L、5L水桶爲4L、3L水桶爲3L
  7. 將3L的水桶中的水,倒入8L的水桶,這時:8L水桶爲4L、5L水桶爲4L、3L水桶爲0L

第二種(8步)

  1. 將8L的水桶中的水,倒滿3L的水桶,這時:8L水桶爲5L、5L水桶爲0L、3L水桶爲3L
  2. 將3L的水桶中的水,倒入5L的水桶,這時:8L水桶爲5L、5L水桶爲3L、3L水桶爲0L
  3. 將8L的水桶中的水,倒滿3L的水桶,這時:8L水桶爲2L、5L水桶爲3L、3L水桶爲3L
  4. 將3L的水桶中的水,倒滿5L的水桶,這時:8L水桶爲2L、5L水桶爲5L、3L水桶爲1L
  5. 將5L的水桶中的水,倒入8L的水桶,這時:8L水桶爲7L、5L水桶爲0L、3L水桶爲1L
  6. 將3L的水桶中的水,倒入5L的水桶,這時:8L水桶爲7L、5L水桶爲1L、3L水桶爲0L
  7. 將8L的水桶中的水,倒滿3L的水桶,這時:8L水桶爲4L、5L水桶爲1L、3L水桶爲3L
  8. 將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)

clipboard.png

運行結果

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

...

(16種方法,貼上去太長了,大家在本地嘗試下,如需要源碼,請關注公衆號進行留言。)

小結

運行代碼之後,一共找到了 16 種倒水的方法,最快的方法需要 7 個步驟。

“怎麼樣,是不是沒想到會有這麼多方法吧,去考考你身邊的小夥伴吧。”

本文歡迎轉發,轉發請註明作者和出處,謝謝!

推薦閱讀

clipboard.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章