有三個容積分別爲3升、5升、8升的水桶,其中容積爲8升的水桶中裝滿了水,容積爲3升和容積爲5升的水桶都是空的。三個水桶都沒有刻度,如今須要將大水桶中的8升水等分紅兩份,每份都是4升水,附加條件是隻能這三個水桶,不能借助其餘輔助容器。html
「恩,是的,這是一個很經典的問題。」算法
「然而,咱們並不能想全,不信請繼續往下看。」緩存
」廢話很少說,直接看方法吧。「安全
我相信答案確定不止兩個,到底有多少種答案?設計
帶着這個疑問,咱們來設計一個算法吧。code
解決這個問題的關鍵是怎麼經過倒水湊出肯定的1升水或能容納1升水的空間。htm
例如,當8L水桶或5L水桶或3L水桶有1L水時,都能快速倒出4L水。blog
「窮舉法」接口
水桶初始狀態: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種方法,貼上去太長了,你們在本地嘗試下,如須要源碼,請關注公衆號進行留言。)
運行代碼以後,一共找到了 16 種倒水的方法,最快的方法須要 7 個步驟。
「怎麼樣,是否是沒想到會有這麼多方法吧,去考考你身邊的小夥伴吧。」
本文歡迎轉發,轉發請註明做者和出處,謝謝!