`
love19820823
  • 浏览: 933757 次
文章分类
社区版块
存档分类
最新评论

重温 汉诺塔 问题

 
阅读更多

零、汉诺塔问题
在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。

问题描述:ABC三柱,把圆盘从下面开始按大小顺序从A重新摆放在另一根柱子C上,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
一、递归算法
思想:每次将剩下的最大的圆盘的上面的n-1个盘子们 都 搬移到 非目标柱上(可以是A 或B 或C),然后将最大的圆盘n搬移到 目标柱上(最后都是C柱子,在过程中可以是A/B之一),最后将n-1个柱子们搬移到 C柱。 递归的临界条件是:当只剩下有一个圆盘1(最小的圆盘),直接将其搬到目标柱子上{Move(1,a,c);}。
Hannoi(int n,char a ,char b, char c)定义为将n号圆盘搬从a搬到c, 之所以需要b参数,是因为在递归时,需要将n-1号圆盘从a搬到b,然后移动n号圆盘从a到c,然后将n-1号圆盘从b移动到c(因此需要传递b这个中间柱子变量)。

二、非递归方法
思想:一位美国学者发现一种出人意料的简单方法,只要轮流进行两步操作就可以了。首先把三根柱子按顺序排成品字型,把所有的圆盘按从大到小的顺序放在柱子A上,根据圆盘的数量确定柱子的排放顺序:若n为偶数,按顺时针方向依次摆放 A B C;

  若n为奇数,按顺时针方向依次摆放 A C B。

  (1)按顺时针方向把圆盘1从现在的柱子移动到下一根柱子,即当n为偶数时,若圆盘1在柱子A,则把它移动到B;若圆盘1在柱子B,则把它移动到C;若圆盘1在柱子C,则把它移动到A。

  (2)接着,把另外两根柱子上可以移动的圆盘移动到新的柱子上。即把非空柱子上的圆盘移动到空柱子上,当两根柱子都非空时,移动较小的圆盘。这一步没有明确规定移动哪个圆盘,你可能以为会有多种可能性,其实不然,可实施的行动是唯一的。

  (3)反复进行(1)(2)操作,最后就能按规定完成汉诺塔的移动。

  所以结果非常简单,就是按照移动规则向一个方向移动金片:

  如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics