sicily 6306. Hanoi Tower
Description
有三根杆子A,B,C。A杆上有n个(n>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:
1.每次只能移动一个圆盘;
2.大盘不能叠在小盘上面。
可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,其间也可借助C杆,但都必须遵循上述两条规则。
传说印度某间寺院也有这样三根柱子,上串64个金盘。寺院里的僧侣依照一个古老的预言,以上述规则移动这些盘子;
预言说当这些盘子移动完毕,世界就会灭亡。这个传说叫做梵天寺之塔问题(Tower of Brahma puzzle)。
可以证明,当盘子的个数为n时,移动的次数最少为2^n – 1,现给出n,并对盘子从上到下依次编号为1~n,求具体的移动步骤。
三个圆盘的移动示例如下:
A B C
Input
输入包括多组测试用例,每组测试用例为一个整数n(1<=n<=15),当n为0时结束。
Output
对于每组测试用例,输出具体的移动步骤,每组测试数据之后有一个空行。
经典递归问题,奇怪的是我们班上的作业没有布置过这个=___= 反正法师班上的题还在running,顺手刷掉,有空再来研究下非递归的做法
1 #include <stdio.h> 2 void move( int n, char from, char to, char aux ) 3 { 4 if( n == 1 ) 5 { 6 printf( "Move disk 1 from %c to %c\n", from, to ); 7 return; 8 } 9 else 10 { 11 move( n - 1, from, aux, to); 12 printf("Move disk %d from %c to %c\n",n,from, to ); 13 move( n - 1, aux, to, from ); 14 } 15 16 } 17 int main() 18 { 19 int n; 20 while ( scanf("%d", &n) && n != 0 ) 21 { 22 move(n,'A','C','B'); 23 printf("\n"); 24 } 25 26 return 0; 27 }