ハノイの塔 むずかしい

問題

3本の柱 A, B, C があり、柱 AN 枚の円盤が小さい順(上が小さい)に積まれています。これをすべて柱 C へ移してください。ルールは次の2つです。

最小手数で移すときの手順を、1手ずつ X->Y の形(例 A->C)で1行ずつ出力してください。

入力 / 出力

円盤の枚数 N が与えられます。動かす手順を上から順に1行ずつ出力してください(全部で 2^N − 1 行)。

制約

入出力例

入力出力
1A->C
2A->B
A->C
B->C
ヒント(再帰): この問題は「関数が自分自身を呼ぶ再帰で解くのが定番です。
「N枚を A から C へ移す」は、次の3ステップに分解できます:
  1. 上の N-1 枚を A から B へ移す
  2. 一番下の1枚を A から C へ動かす(A->C を出力)
  3. N-1 枚を B から C へ移す
これをそのまま関数にします(from=今ある柱、to=行き先、via=経由):
void hanoi(int n, char from, char to, char via) {
    if (n == 1) { cout << from << "->" << to << endl; return; }
    hanoi(n - 1, from, via, to);            // ① N-1枚を via へ
    cout << from << "->" << to << endl;       // ② 一番下を to へ
    hanoi(n - 1, via, to, from);            // ③ N-1枚を to へ
}
main から hanoi(n, 'A', 'C', 'B'); と呼び出します。

コーディング

※ コンパイル・実行はブラウザ内の簡易C++エンジン(JSCPP)で動いています。学習用のため、本物のコンパイラ(Visual Studio など)と一部の挙動・エラー表示が異なる場合があります。