汉诺塔 Hanoi Tower

电影《猩球崛起》刚开始的时候,年轻的Caesar在玩一种很有意思的游戏,就是汉诺塔......

  

  汉诺塔源自一个古老的印度传说:在世界的中心贝拿勒斯的圣庙里,一块黄铜板上插着三支宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上穿好了由大到小的64片金片,这就是所谓的汉诺塔(Hanoi Tower)。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。

  僧侣们预言,当所有的金片从梵天穿好的金片上移到另一根针上时,世界末日就会来临,而梵塔、寺庙和众生也会随之灭亡......

故事不多说了,汉诺塔是递归思想的典型应用,上代码:

 1 #include <stdio.h>
 2 
 3 // 将n个金片,借助y,从x移动到z
 4 void move(int n, char x, char y, char z)
 5 {
 6     if ( 1 == n)
 7         printf("%c -> %c\n",x,z);
 8     else
 9     {
10         move(n-1, x, z, y);         //将 n-1 个金片从x,借助z,移动到y
11         printf("%c -> %c\n",x,z);   //将第 n 个金片从 x 移动到 z
12         move(n-1, y, x, z);         //将 n-1 个金片从y,借助x,移动到z
13     }
14 }
15 
16 int main()
17 {
18     int n;
19     printf("请输入汉诺塔的层数:");
20     scanf("%d",&n);
21     move(n,'X','Y','Z');
22 
23     return 0;
24 }

  最后,考虑金片移动的步数和金片数的关系:

  每增加一个金片,它的移动的步数就等于原来步数的两倍加1。递推公式为:f(n+1) = 2*f(n) + 1,不难得到f(n) = 2^n - 1。

  例如3个金片步数为7,那么4个金片步数为2*7+1=15步,5个金片步数为2*15+1=31步。

  至此,可以推算金片数为64时,移动的步数为:18446744073709551615步。假设1秒钟移动一次,所需时间为:18446744073709551615秒,大约5845亿年,到时宇宙还在不在......

posted @ 2014-12-16 01:04  伟博赵  阅读(920)  评论(0编辑  收藏  举报