[BOJ]白峻11729号ハノイタワー移動順
リンク
https://www.acmicpc.net/problem/11729
質問する
3本の棒があり、1本目の棒にはn個の半径の異なる円板が積み上げられている.各円板は半径の大きい順に積み上げられている.現在、修道僧たちは以下の規則に従って、最初の棒から3番目の棒に移動します.
一度に1枚の原版を別の塔に移すしかない.
積み上げられたフィルムはいつも上のほうが下のより小さい.
プログラムを作成し、この操作を実行するために必要な移動順序を出力します.ただし、移動回数を最小限に抑える必要があります.
下図は5枚のバックグラウンドの例です.
入力
第1行は、第1の棒に積まれた円板の個数N(1≦N≦20)を与える.
しゅつりょく
1行目に移動した回数出力K.
2行目から実行プロセスの出力を開始します.2行目から、2つの整数A BをK行に分けて出力します.これは、A番タワーの一番上の円板をB番タワーの一番上に移動することを意味します.
に答える
#include <iostream>
using namespace std;
int k;
void func(int a, int b, int n) {
if (n == 1) {
cout << a << ' ' << b << '\n';
return;
}
func(a, 6 - a - b , n - 1);
cout << a << ' ' << b << '\n';
func(6 - a - b, b, n - 1);
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> k;
cout << (1 << k) - 1 << '\n';
func(1, 3, k);
}
説明:
復帰する
n号円板のみに集中すると、何があっても円板をすべて柱1から柱3に移動したい場合は、n号円板を柱3に移動します.
1番からn-1番の円板を全部譲って、柱2まで行きます.彼らのいずれかが柱3に行くと、小さな円板には円板のルールを大きくすることができないので、n番の円板は柱3に移動できません.
1枚のフィルムの場合、フィルムを私のほしいところに移すことができます.
オリジナルがk個の場合に移動可能であれば、オリジナルがk+1個の場合にも移動可能である.
1.関数の定義
void func(int a, int b , int n)
:n個の円板をa番柱からb番柱に移動する方法の関数を出力する2. base condition
n=1時
cout << a << ' ' << b << '\n;
3.回帰式n-1枚の円板を柱aから柱6-a-bに移動します.
func(a, 6-a-b, n-1);
->回数A回n番の円板を柱aから柱bに移動します.
cout << a << ' ' << b << '\n;
->回数A+1回n-1枚の円板を柱6-a-bから柱bに移動します.
func(6-a-b, b, n-1);
->回数2 A+1回->秒項が1であるため、この数列の一般項は2^k-1である.🧷
(1<<k)
:「<<」はleft shiftと呼ばれるビット演算子で、1をビットとしてk格子を押す必要があるため、2^kになります.source : ドック実戦アルゴリズム0 x 0 B鋼
Reference
この問題について([BOJ]白峻11729号ハノイタワー移動順), 我々は、より多くの情報をここで見つけました https://velog.io/@dnflrhkddyd/BOJ-백준-11729번-하노이-탑-이동-순서テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol