大きさの異なる2つのバケットと、どちらを先に満たすかが与えられたとき、バケット間で戦略的に液体を移し替えて、正確なリットル数を量るには何回の操作が必要かを求めます。
解答が従わなければならないルールがいくつかあります。
プログラムは次のものを入力として受け取ります。
プログラムは次のことを求める必要があります。
注意: どちらか一方、または両方のバケットに変化が生じるたびに、1回の操作として数えます。
例: バケット1には最大7リットル、バケット2には最大11リットル入ります。 ある時点で、バケット1に7リットル、バケット2に8リットル入っているとします(7,8)。 バケット1を空にし、バケット2には何もせず、それぞれ0リットルと8リットル(0,8)になったとすると、これは1回の操作として数えます。 逆に、バケット2がいっぱいになるまでバケット1からバケット2へ注ぎ、その結果バケット1に4リットル、バケット2に11リットル(4,11)になったとしても、これも1回の操作としてしか数えません。
もう1つの例: バケット1には3リットル、バケット2には最大5リットル入ります。 ここでは、バケット1から始めなければならないとします。 すると、最初の操作はバケット1を満たすことになります。 2回目の操作として、バケット1を空にすることにします。 3回目の操作でバケット2を満たすことはできません。これは3つ目のルールに反するからです。どのような操作の後でも、開始バケットが空でもう一方のバケットがいっぱいである状態になってはいけません。
Fullstack AcademyのLindsay Levineが<3を込めて書きました。
| レジスタ | 用途 | 型 | 説明 |
|---|---|---|---|
$a0 |
入力 | アドレス | バケットの容量を並べたワード配列 |
$a1 |
入力 | 整数 | 開始バケット(1または2) |
$a2 |
入力 | 整数 | 目標の量 |
$a3 |
入出力 | アドレス | 最終的なバケットの中身を並べたワード配列 |
$v0 |
出力 | 整数 | 必要な操作の数。不可能な場合は-1 |
$t0-9 |
一時的 | 任意 | 一時的な保存に使います |