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 }

 

posted @ 2013-01-19 15:48  Joyee  阅读(244)  评论(0编辑  收藏  举报