一.什么是汉诺塔?
设有 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 后查看