有三個容積分別為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 公升水和另外兩個空水桶...