Hanoiタワー問題(SWUST)
タイトルの説明:
(n次Hanoi塔問題)A,B,Cとそれぞれ命名された3つの塔座があり,塔座Aにはn(n<20)個の直径の大きさがそれぞれ異なり,小さいから大きいまで1,2,...,nの円盤が挿入されていると仮定する.次に、A軸上のn個の円盤をタワーC上に移動し、同じ順序で積み重ねなければならない.円盤が移動するときは、以下の規則に従わなければならない.1)毎回1個の円盤しか移動できない.2)円盤はA、B、Cのいずれかのタワーに挿入することができる.3)いずれの時点においても、より大きな円盤をより小さな円盤の上に押し付けることはできない.プログラムにより移動するステップを印刷してください.
入力:
入力データのセットが1つしかありません.入力データN(;開始時のAタワーにおける皿数を示す)は、0を入力とプログラムが終了する.
出力:
移動のステップを出力.例えば、「A->C」、「A->B」等である.2つのステップの間に3つのスペースが区切られ、出力5つのステップごとに改行する.詳細はSample Output.
コードは次のとおりです.
サンプル入力:
5 2 0
サンプル出力:
A–>C A–>B C–>B A–>C B–>A B–>C A–>C A–>B C–>B C–>A B–>A C–>B A–>C A–>B C–>B A–>C B–>A B–>C A–>C B–>A C–>B C–>A B–>A B–>C A–>C A–>B C–>B A–>C B–>A B–>C A–>C A–>B A–>C B–>C
(n次Hanoi塔問題)A,B,Cとそれぞれ命名された3つの塔座があり,塔座Aにはn(n<20)個の直径の大きさがそれぞれ異なり,小さいから大きいまで1,2,...,nの円盤が挿入されていると仮定する.次に、A軸上のn個の円盤をタワーC上に移動し、同じ順序で積み重ねなければならない.円盤が移動するときは、以下の規則に従わなければならない.1)毎回1個の円盤しか移動できない.2)円盤はA、B、Cのいずれかのタワーに挿入することができる.3)いずれの時点においても、より大きな円盤をより小さな円盤の上に押し付けることはできない.プログラムにより移動するステップを印刷してください.
入力:
入力データのセットが1つしかありません.入力データN(;開始時のAタワーにおける皿数を示す)は、0を入力とプログラムが終了する.
出力:
移動のステップを出力.例えば、「A->C」、「A->B」等である.2つのステップの間に3つのスペースが区切られ、出力5つのステップごとに改行する.詳細はSample Output.
コードは次のとおりです.
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int maxn = 1e6+10;
int n;
string ans[maxn];
ll step = 1;
void Hanoi(int i, string src, string mid, string dest){
if(i == n){
ans[step++] = src+"-->"+dest;
return ;
}
Hanoi(i+1, src, dest, mid);
ans[step++] = src + "-->" + dest;
Hanoi(i+1, mid, src, dest);
}
int main()
{
while(cin >> n && n){
step = 1;
Hanoi(1, "A", "B", "C");
for(int i = 1; i < step; i++){
cout << ans[i] << " ";
if(i%5 == 0)
cout << endl;
}
if((step-1)%5)
cout << endl;
}
return 0;
}
サンプル入力:
5 2 0
サンプル出力:
A–>C A–>B C–>B A–>C B–>A B–>C A–>C A–>B C–>B C–>A B–>A C–>B A–>C A–>B C–>B A–>C B–>A B–>C A–>C B–>A C–>B C–>A B–>A B–>C A–>C A–>B C–>B A–>C B–>A B–>C A–>C A–>B A–>C B–>C