ルール
ハノイの塔はパズルです。よく知らない場合は、次のように操作します。
プレイ フィールドは 3 つのロッドとx個のディスクで構成され、次のディスクは前のディスクよりも大きくなっています。ディスクは、次のルールでロッドに取り付けることができます。
- 一度に移動できるディスクは 1 つだけであり、別のロッドの上で移動する必要があります
- ディスクはロッドの上部から取らなければなりません
- ターゲットロッドの最上部のディスクが移動するディスクよりも大きい場合にのみ、ディスクをどこかに移動できます
そして最後に - プレイフィールドは次のように始まります:
- x個の円盤があり、最大のものを下に、最小のものを上に並べた棒
- 空の棒
- 空の棒
ゲームの目標は、ディスクの元の「スタック」を別のロッドに移動することです。つまり、すべてのディスクを別のロッドに配置します。したがって、(ここでも)最大のものは下に、最小のものは上になります。
実装
あなたの目標は、選択したプログラミング言語でプログラムを作成することです。このプログラムは、入力 (以下で説明) を受け取り、位置を解決するために必要なステップを出力します。
いつものように、できるだけ短くするようにしてください。
入力
入力例:
4-3,7-6-5,2-1
入力は、コンマで区切られた 3 つの部分で構成される文字列です。パーツは、3 つのロッドのそれぞれにあるディスクのリストです。今回はハイフン ( - ) で区切られており、各サブパートは数字であり、数字が大きいほどディスクが大きくなります。
したがって、上記の入力の場合、これは視覚的な表現になります。
. . .
| =====|===== |
===|=== ======|====== =|=
====|==== =======|======= ==|==
ROD 1 ROD 2 ROD 3
出力
上の図でわかるように、入力の一番左の部分がロッド番号 1、中央がロッド番号 2、最後の部分がロッド番号 3 です。
プログラムの出力は次のようになります。
12,23,31,12,23,13
ディスクを取り出すロッドとディスクを取り付けるロッドを定義する、コンマで区切られた番号のリスト。ロッドは 3 つしかないため、考えられる組み合わせは 6 つだけです (ディスクを同じロッドではなく別のロッドに移動する必要があるため)。
12
13
21
23
31
32
ノート
入力は、「元の」状態のフィールドを記述する必要はありません。解決の途中でもかまいません。
あなたのプログラムはヌル出力を生成できません。入力が元の状態の場合は、ディスクを別のロッドに入れるだけです。
入力には、次のように空のロッドを含めることができます。
2-1,3,
,,1
4-3,,2-1
入力がこのようにフォーマットされていない場合、プログラムは未定義の動作を引き起こす可能性があります。そのため、入力が有効でない場合 (小さいディスクに大きなディスクが接続されている、ディスクが見つからない、解決できないなど) は可能です。入力は常に有効です。
ソリューションが可能な限り高速であることを確認してください (可能な限り少ないターン)。つまり、「12,21,12」でターンを無駄にしないでください...
テスト
そこで、この小さなフラッシュを用意しました。これを使用すると、プログラムが適切なソリューションを生成したかどうかを書き留めたり何もせずにテストしたりできます。
ここにあります:Hanoi AlgoTest(ロードしてから更新するのを待ちます-デッドリンク:|)
これを使用するには、プログラムへの入力をINPUTフィールドに貼り付け、プログラムによって生成された出力をPROCESSフィールドに貼り付けます。変更可能な速度でシミュレーションを実行し、視覚的な表現を使用して、下部にエラーを出力します。
それが役に立てば幸い。