給你兩個大小不同的水桶,並指定要先裝滿哪一個水桶,請判斷在兩個水桶之間策略性地倒水,需要多少個動作才能量出剛好幾公升。
你的解法必須遵守以下規則:
你的程式會接收以下輸入:
你的程式應該判斷出:
注意:只要其中一個水桶或兩個水桶的狀態有改變,就算一個(1)動作。
範例: 第一個水桶最多可以裝 7 公升,第二個水桶最多可以裝 11 公升。 假設在某個步驟,第一個水桶裝了 7 公升,第二個水桶裝了 8 公升(7,8)。 如果你倒空第一個水桶,第二個水桶維持不變,兩個水桶分別剩下 0 公升和 8 公升(0,8),這算一個動作。 反過來說,如果你把第一個水桶倒進第二個水桶,直到第二個水桶滿了,結果第一個水桶剩下 4 公升、第二個水桶有 11 公升(4,11),這也同樣只算一個動作。
另一個範例: 第一個水桶可以裝 3 公升,第二個水桶最多可以裝 5 公升。 題目要求你必須從第一個水桶開始。 所以你的第一個動作是裝滿第一個水桶。 你選擇在第二個動作倒空第一個水桶。 到了第三個動作,你不能裝滿第二個水桶,因為這違反了第三條規則:任何動作之後,都不能出現起始水桶是空的、而另一個水桶是滿的狀態。
由 Lindsay Levine 在 Fullstack Academy 用 <3 寫成。
在 twobucket 套件中,實作一個 Go 函式,命名為 Solve,簽章如下:
func Solve(sizeBucketOne,
sizeBucketTwo, goalAmount int, startBucket string,
) (goalBucket string, numSteps, otherBucketLevel int, e error)
Solve 會回傳四個值:最終達成目標水量的桶子("one" 或 "two")、達成目標水量所需的移動次數/步數、另一個桶子中剩下的公升數,以及一個錯誤值。 若參數無效,或不可能有解,請回傳一個錯誤。