三個容器倒水 三個水桶等分8公升水的問題 演算法的樂趣

2021-10-16 10:53:45 字數 1849 閱讀 1590

有三個容積分別為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.當前水桶為最大容積時,其他水桶不能再向這個水桶倒水。

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

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

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

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

有三個容積分別為8公升 5公升 3公升的水桶,其中容積為8公升的水桶盛滿了水,容積為5公升和3公升的水桶都是空的。三個水桶都沒有刻度,現在需要將水桶中的8公升水等分成2份,每份都是4公升水。條件是只能使用這三個水桶,不能借助其他工具。對於這個問題,似乎沒有 規律 可循,沒有專門的演算法來求解,因此只...

三個桶等分八公升水

狀態樹的遍歷 有這樣一道智力題目 有三個容積分別是3公升 5公升和8公升的水桶,其中容積為8公升的水桶中裝滿了水,容積為3公升和容積為5公升的水桶是空的。3個水桶都沒有體積刻度,現在需要將大水桶中的8公升水等分成兩份,每份都是4公升水,附加條件是只能使用另外兩個空水桶,不能借助其他輔助容器。這是乙個...

第3 2課 用三個水桶等分 8 公升水的問題

有這樣乙個智力題目 有三個分別是 3 公升 5 公升和 8 公升容積的水桶,其中容積為 8 公升的水桶中裝滿了水,容積為 3 公升和容積為 5 公升的水桶是空的,三個水桶都沒有體積刻度。現在需要把大水桶中的 8 公升水等分成兩份,每份都是 4 公升水,附加條件是只能使用這 8 公升水和另外兩個空水桶...