vlambda博客
学习文章列表

C语言案例---汉诺(Hanoi)塔问题










C语言案例---汉诺(Hanoi)塔问题
C语言案例---汉诺(Hanoi)塔问题


C语言案例---汉诺(Hanoi)塔问题

2020.08.14

C语言分享





#01#前言




C语言案例---汉诺(Hanoi)塔问题

C语言案例---汉诺(Hanoi)塔问题



C语言案例---汉诺(Hanoi)塔问题【引】

    【汉诺(Hanoi)塔问题】据说创世纪时Benares有一塔波罗教塔,是由三支钻石棒(Pag)所支撑,开始时神在第一根棒上放置64个由上至下依次由小至大排列的金盘(Disc),并命令僧侣将所有的金盘从第一根石棒移至第三根石棒,且搬运过程中遵守大盘子在小盘子之下的原则,若每日仅搬一个盘子,则当盘子全数搬运完毕之时,此塔将毁损,也就是世界末日来临之时。

既:

    将塔座A上的圆盘移动到塔座C上。

规则:1. 每次移动一个圆盘;

           2. 圆盘只能在塔座A,B,C之间移动;

            3. 大圆盘不能放在小圆盘上。

C语言案例---汉诺(Hanoi)塔问题--递归应用

1、对于汉诺塔问题,当只移动一个圆盘时,直接将圆盘从 A 塔座移动到 C 塔座。若移动的圆盘为 n(n>1),则分成几步走:把 (n-1) 个圆盘从 A 塔座移动到 B 塔座(借助 C 塔座);A 塔座上的最后一个圆盘移动到 C 塔座;B 塔座上的 (n-1) 个圆盘移动到 C 塔座(借助 A 塔座)。每做一遍,移动的圆盘少一个,逐次递减,最后当 n 为 1 时,完成整个移动过程。

2、所以,解决汉诺塔问题可设计一个递归函数,利用递归实现圆盘的整个移动过程。

本文分成三部分:

1、例子介绍

2、具体代码及说明

3、讨论区

#OVER#

C语言案例---汉诺(Hanoi)塔问题

#02#具体代码及说明



#include <stdio.h>
int i=1;
void Hanoi (int n,  char X,  char Y,  char Z)
{// n表示需要移动盘子的数量,X表示源塔,Y表示借用塔,Z表示目标塔

   if(n==1) // 只有一个盘子时,将其从X塔移动到Z塔
       printf("%d:%c->%c\n",i++,X,Z);
       //c++写法:cout<<X<<"->"<<Z<<"\t";
   else
   {
       //①借助Z塔,将前n-1个盘子从X塔移动到Y塔
       Hanoi (n-1, X, Z, Y);
       //②将X塔上剩下的1个盘子移到Z塔
       printf("%d:%c->%c\n",i++,X,Z);
       //c++写法:cout<<X<<"->"<<Z<<"\t";
       //③借助X塔,将前n-1个盘子从Y塔移动到Z塔
       Hanoi (n-1, Y, X, Z);
   }
}


int main(void)
{
   int gg;
   printf("请输入需要移动的盘子的数量:\n");
   scanf("%d",&gg);
   char x='a',y='b',z='c';
   Hanoi (gg,x,y,z);//调用函数
   printf("完成!\n");
   return 0;
}


#OVER#

C语言案例---汉诺(Hanoi)塔问题

#03#运行结果



请输入需要移动的盘子的数量:

3

1:a->c

2:a->b

3:c->b

4:a->c

5:b->a

6:b->c

7:a->c

完成!


#OVER#



C语言案例---汉诺(Hanoi)塔问题
C语言案例---汉诺(Hanoi)塔问题


C语言案例---汉诺(Hanoi)塔问题


了解更多点击下方搜索汉诺塔即可阅读课件


科学大世界推荐搜索
汉诺塔



【图片来源:成都向上】


视频来源:科学大世界

文字:科学大世界

文章封面图:网络

图片:网络【图片下方已标明】

部分引用:学校课件并标识【引】

转载请声明:科学大世界

😘😘😘


觉得不错点个在看呗


2020/08/14