数据结构入门(十二)——递归(2)——汉诺塔问题

前言

本系列文章是笔者学习数据结构的笔记,如有不妥之处欢迎指正



题干

Description

 汉诺塔是源自印度神话的玩具。
 神创造世界的是哦胡制造了三根柱子,在其中一根柱子上从上至下按大小顺序依次摞有64片黄金圆盘。
 神命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上,要求小圆盘上面不能放大圆盘且一次只能移动一个圆盘。

Input

 输入金片的个数n。这里的n<=10。

Output

 输出搬动金片的全过程。格式见样例。

Sample

Input
 2
Output
Move disk 1 from A to B
Move disk 2 from A to C
Move disk 1 from B to C

扫描二维码关注公众号,回复: 12395802 查看本文章

分析

由规律可得
  如果是一个盘子
   直接将A柱的盘子移到C柱
 否则
   先将A柱的n-1个盘子借助C移到B
   将A柱的盘子从A移到C
   最后将B柱的n-1个盘子借助A移到C

  • 以上分析直接写成递归的形式

代码

#include<stdio.h>
void hannuota(int n,char ch1,char ch2,char ch3)
{
    
    
    if(n==1)												//如果是一个盘子
    {
    
    
        printf("Move disk %d from %c to %c\n",n,ch1,ch3);   //直接将A柱的盘子移到C柱
    }
    else													//否则
    {
    
    
        hannuota(n-1,ch1,ch3,ch2);							//先将A柱的n-1个盘子借助C移到B
        
        printf("Move disk %d from %c to %c\n",n,ch1,ch3);	//将A柱的盘子从A移到C
        
        hannuota(n-1,ch2,ch1,ch3);							//最后将B柱的n-1个盘子借助A移到C
        
    }
}

int main()
{
    
    
    int n;

    scanf("%d",&n);

    hannuota(n,'A','B','C');
}

输入

3

输出

Move disk 1 from A to C
Move disk 2 from A to B
Move disk 1 from C to B
Move disk 3 from A to C
Move disk 1 from B to A
Move disk 2 from B to C
Move disk 1 from A to C

猜你喜欢

转载自blog.csdn.net/qq_40016124/article/details/113343423