(n阶Hanoi塔问题)假设有三个分别命名为A、B、C的塔座,在塔座A上插有n(n<20)个直径大小各不相同、依小到大编号为1,2,…,n的圆盘。现要求将A轴上的n个圆盘移至塔座C上并仍按同样顺序叠排,圆盘移动时必须遵循下列规则: 1)每次只能移动一个圆盘; 2)圆盘可以插在A、B、C中的任一塔座上; 3)任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。 请通过编程来打印出移动的步骤.
只有一组输入数据.输入数据N(;表示在开始时A塔座上的盘子数),当输入0时程序结束.
输出移动的步骤.如"A–>C","A–>B"等.每两的步骤之间有三个空格隔开,每输出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