三個桶等分八公升水

2022-04-07 21:41:32 字數 1283 閱讀 6463

狀態樹的遍歷

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

​ 這是乙個很經典的問題,但是並不難,大部分人都可以在一分鐘內給出答案。不過,很多人可能沒有注意到,這個問題的答案不止乙個。先來看乙個最常見的答案,也是目前已知最快的操作步驟,一共倒水7次。

1)從8公升水桶中倒5公升水到5公升水桶中

2)從5公升水桶中倒3公升水到3公升水桶中

3)從3公升水桶中倒3公升水到8公升水桶中

4)從5公升水桶中倒2公升水到3公升水桶中

5)從8公升水桶中倒5公升水到5公升水桶中

6)從5公升水桶中倒1公升水到3公升水桶中

7)從3公升水桶中倒3公升水到8公升水桶中

​ 最後的結果是5公升水桶和8公升水桶中各有公升水,其實還有很多種答案,我們就不一一枚舉了,到底有多少種答案?水從水桶間倒來倒去,情況太多了,我們算不出來,但是計算機可以。設計乙個演算法,讓計算機幫助我們把所有的答案都找出來,這就是本章的內容。

​ 如果用人的思維方式,那麼解決這個問題的關鍵是怎麼通過倒水湊出確定的1公升水或能容納1公升水的空間,三隻水桶的容積分別是3、5和8,用這三個數做加減運算,可以得到很多組答案,例如:

3 - (5 - 3) = 1

​ 但是計算機並不能理解這個「1」的重要性,很難按照人類的思維方式按部就班地推導答案,因此計算機解決這個問題,通常會用「窮舉法」。為什麼用「窮舉法」呢?因為這不是乙個典型意義上的求解最優解的問題,雖然可能暗含了求解倒水次數最少的方法的要求,但就本質而言,常用的求解最優解問題的高效方法都不適用於此問題。如果能夠窮舉解空間的全部合法解,然後通過比較找到最優解也是一種求解最優解的方法。

​ 乙個合法的倒水動作包含三個要素:倒出水的桶、倒入水的桶和倒水體積。我們用乙個三元組來描述倒水動作:from是指從哪個桶中倒水,to是指將水導向哪個桶,water是此次倒水動作所倒的水量。倒水動作的資料結構定義如下。

typedef

struct tagactionaction;

​ 包含動作的倒水狀態定義如下:

struct bucketstate

;

bool bucketstate::

cantakedumpaction

(int from,

int to)

return

false

;}

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

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

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

有三個容積分別為3公升 5公升 8公升的水桶,其中容積為8公升的水桶中裝滿了水,容積為3公升和容積為5公升的水桶都是空的。三個水桶都沒有刻度,現在需要將大水桶中的8公升水等分成兩份,每份都是4公升水,附加條件是只能這三個水桶,不能借助其他輔助容器。恩,是的,這是乙個很經典的問題。然而,我們並不能想全...

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

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