数据结构与算法九:经典算法面试题--3.汉诺塔问题

172 阅读3分钟

这是我参与8月更文挑战的第18天,活动详情查看:8月更文挑战

关注我,以下内容持续更新

数据结构与算法(一):时间复杂度和空间复杂度

数据结构与算法(二):桟

数据结构与算法(三):队列

数据结构与算法(四):单链表

数据结构与算法(五):双向链表

数据结构与算法(六):哈希表

数据结构与算法(七):树

数据结构与算法(八):排序算法

数据结构与算法(九):经典算法面试题

汉诺塔问题

 汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower)又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?

算法分析

 设A上有n个盘子。

  • 如果n=1

    将圆盘从A直接移动到C。
    
  • 如果n=2

    ①将A上的n-1(等于1)个圆盘移到B上;
    
    ②再将A上的一个圆盘移到C上;
    
    ③最后将B上的n-1(等于1)个圆盘移到C上。
    
  • 如果n=3

    第一步:将A上的n-1(等于2,将其看做n)个圆盘移到B(借助于C),步骤如下:
    
       ①将A上的n-1(等于1)个圆盘移到C上。
    
       ②将A上的一个圆盘移到B。
    
       ③将C上的n-1(等于1)个圆盘移到B。
    
    第二步:将A上的一个圆盘移到C。
    
    第三步:将B上的n-1(等于2,将其看做n)个圆盘移到C(借助A),步骤如下:
    
        ①将B上的n-1(等于1)个圆盘移到A。
    
        ②将B上的一个盘子移到C。
    
        ③将A上的n-1(等于1)个圆盘移到C。到此,完成了三个圆盘的移动过程。
    

总结: 当n大于等于2时,移动的过程可分解为三个步骤:

 第一步 把A上的n-1个圆盘移到B上;

 第二步 把A上的一个圆盘移到C上;

 第三步 把B上的n-1个圆盘移到C上;数据结构与算法九:经典算法面试题--1.迷宫问题    

完整代码

//a:起点  c:终点  b:辅助作用
-(void)HanoiTower:(int)n a:(NSString*)a b:(NSString*)b c:(NSString*)c{
    if (n == 1) {//递归出口
        [self move:n start:a end:c];
    }else{
        //第一步 把A上的n-1个圆盘移到B上;
        [self HanoiTower:n-1 a:a b:c c:b];
        //第二步 把A上的一个圆盘移到C上;
        [self move:n start:a end:c];
       //第三步 把B上的n-1个圆盘移到C上;
        [self HanoiTower:n-1 a:b b:a c:c];
    }
}

-(void)move:(int)n start:(NSString*)start end:(NSString*)end{
    printf("%d号盘子:%s--->%s \n", n,start.UTF8String,end.UTF8String);
}

 通过打印,n=3时移动的过程如下

 1号盘子:a--->c

 2号盘子:a--->b

 1号盘子:c--->b

 3号盘子:a--->c

 1号盘子:b--->a

 2号盘子:b--->c

 1号盘子:a--->c

关注我

如果觉得我写的不错,请点个赞 关注我 您的支持是我更文最大的动力!