问题描述
输入格式
输出格式
样例输入
3
样例输出
A--->C
A--->B
C--->B
A--->C
B--->A
B--->C
A--->C
题解
当n=1时,移动步骤为
A--->C
当n=2时,移动步骤为
A--->B
A--->C
B--->C
当n=3时,移动步骤为
A--->C
A--->B
C--->B
A--->C
B--->A
B--->C
A--->C
我们先把A座上的圆盘从上到下编号
观察以上三种情况,当我们想把A座上从上往下第i个圆盘移到C座上时,我们可以先把前i-1个圆盘移到B座上,然后把第i个圆盘移到C座上,再把B座上所有圆盘移到C座上
而前i-1个圆盘从A座移到B座的过程,和前i个圆盘从A座移到C座的过程类似,都是把一堆圆盘从一根柱子移到另一根柱子,且保证所有圆盘的相对位置在移动前后保持不变
我们把前i-1个圆盘从A座移到B座,可以先把前i-2个圆盘移到C座,然后把第i-1个圆盘移到B座,再把前i-2个圆盘移到B座
把前i-2个圆盘移到C座,可以先把前i-3个圆盘移到B座,然后把第i-2个圆盘移到C座,再把前i-3个圆盘移到C座
……
于是我们考虑递归
我们定义一个函数hanoi(int n,char a,char b,char c),表示把前n个圆盘按上述步骤从a座移到c座(a,b,c用于存储三根柱子的编号,其中a的值可能为’A’,’B’,’C’;b,c也是)
如果当前A座上只剩1个圆盘,直接移到C座上并打印路径
否则,先把前n-1个圆盘移到b座,即hanoi(n-1,a,c,b),然后把第n个圆盘从a座移到c座(打印路径),再把前n-1个圆盘从b座移到c座,即hanoi(n-1,b,a,c)
1 #include <stdio.h> 2 3 void hanoi(int n,char a,char b,char c) 4 { 5 if (n==1) printf("%c--->%c ",a,c); 6 else 7 { 8 hanoi(n-1,a,c,b); 9 printf("%c--->%c ",a,c); 10 hanoi(n-1,b,a,c); 11 } 12 return; 13 } 14 15 int main() 16 { 17 int n; 18 scanf("%d", &n); 19 hanoi(n, 'A', 'B', 'C'); 20 return 0; 21 }