汉诺塔(hanoi)问题(C语言,递归)

发布于:2022-11-28 ⋅ 阅读:(377) ⋅ 点赞:(0)

一.什么是汉诺塔?

        设有 a、b、 c 共 3 根塔座, 在塔座 a上堆叠 n个盘子, 每个盘大小不同, 只允许小盘在大盘之上,最底层的盘最大。

        游戏要求:现在要求将 a上的盘全都移到 c 上,在移的过程中要遵循以下原则:每次只能移动 一个盘;圆盘可以插在 a、b 和 c任一个塔座上;在任何时刻,大盘不能放在小盘的上面。如下图所示

                             

    不明白的同学可以在网上搜汉诺塔也有相似的游戏,自己去玩一下有更加深刻的理解和经验。

  二.完成汉诺塔游戏的思路和方法

        完成汉诺塔这个游戏最重要的是理解递归和游戏的每一步操作动向。

     游戏的基本思路: 

   实现这种算法的分析:

        1,hanoi(n,x,y,z),n表示盘子的数量,x,y,z表示三根柱子,代表将x柱上的n-1个盘子经过y柱后移动到z柱子上。可以先用三个盘子的例子想清楚这个过程,后续的都是以这个方式递归执行下去。

        2,mov(x,z),表示x柱子上最上的盘子直接移动到c柱子上,以打印的方式将移动结果展示出来。

三.棋盘覆盖的具体实现代码

#include<stdio.h>
void hanoi(int n,char x,char y,char z);
void mov(char x,char z);
int n;//盘子数量
char a,b,c;//三个柱子
int main(){
      printf("please input numbers:");
      scanf("%d",&n);
      hanoi(n,'a','b','c');
      return 0;

}
void hanoi(int n,char x,char y,char z)
{

   if(n==1){
       mov(x,z);
   }
   else{
       hanoi(n-1,x,z,y);//将x柱上面的n-1个盘子经z柱移动到y柱
       mov(x,z);//将x柱的盘子移动到z柱
       hanoi(n-1,y,x,z);//将y上的n-1个柱子经过x柱移动到z柱
   }


}
void mov(char x,char z)
{
   printf("%c -> %c\n",x,z);

}

运行结果如图:

 具体的详细过程参考:懒猫老师-C语言-汉诺塔问题详解(hanoi)_哔哩哔哩_bilibili

本文含有隐藏内容,请 开通VIP 后查看