汉诺塔问题

向右看齐 2022-04-17 05:12 384阅读 0赞

问题描述:

相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。

20181113152912984.png

问题分析:

先假设除最下面的盘子之外,我们已经成功地将上面的63个盘子移到了b柱,此时只要将最下面的盘子由a移动到c即可。如图:

23101623-8d8b7e4a0b8644a180276d1f8d504754.png

当最大的盘子由a移到c后,b上是余下的63个盘子,a为空。因此现在的目标就变成了将这63个盘子由b移到c。这个问题和原来的问题完全一样,只是由a柱换为了b柱,规模由64变为了63。因此可以采用相同的方法,先将上面的62个盘子由b移到a,再将最下面的盘子移到c……对照下面的过程,试着是否能找到规律:

  1. 将b柱子作为辅助,把a上的63个圆盘移动到b上
  2. 将a上最后一个圆盘移动到c
  3. 将a作为辅助,把b上的62个圆盘移动到a上
  4. 将b上的最后一个圆盘移动到c
  5. …..

三个盘子:

702782-20161114211933513-1127552732.gif

四个盘子:

702782-20161114212352576-1869972276.gif

也许你已经发现规律了,即每次都是先将其他圆盘移动到辅助柱子上,并将最底下的圆盘移到c柱子上,然后再把原先的柱子作为辅助柱子,并重复此过程,这个过程称为递归。

伪代码实现:

  1. hanoi(n,A,B,C){
  2. //n个盘子,柱子A,B,C
  3. if(n==1) move(A,C); //只有一个盘子时,直接将A柱上的盘子移动到C柱上
  4. else{
  5. hanoi(n-1,A,C,B);//将n-1个盘子由a移动到b,以c为辅助柱子(注意参数顺序)
  6. move(A,C);//将a上的最后一个盘子移动到c
  7. hanoi(n-1,B,A,C);//将n-1个盘子由b移动到c,以a为辅助柱子
  8. }
  9. }

递归算法:

  1. void hanoi(int n,char x,char y,char z){
  2. if(n == 1)
  3. move(x,1,z);
  4. else{
  5. hanoi(n-1,x,z,y);
  6. move(x,n,z);
  7. hanoi(n-1,y,x,z);
  8. }
  9. }

发表评论

表情:
评论列表 (有 0 条评论,384人围观)

还没有评论,来说两句吧...

相关阅读

    相关 问题

    1.汉诺塔问题:如果将n个盘子(由小到大)从a通过b,搬到c,搬运过程中不能出现小盘子在大盘子下面的情况。 分析:这个一个递归问题。只要将n-1个盘子从a通过c(没有中间点肯

    相关 问题

    汉诺塔 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵

    相关 问题

    问题描述: 相传在[古印度][Link 1]圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺

    相关 问题

    汉诺塔问题是经典的递归问题,它的递归类型是:求解问题的方法是递归的。 解题思路: 1. 首先将n-1个盘子从X借助Z移动到Y。 2. 将第n个盘子从X移动到Z。 3.

    相关 问题

    汉诺塔(Tower of Hanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子,其中一根柱子自底向上叠着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新