本期内容
- 什么是汉诺塔
- 汉诺塔的规律是什么
- 汉诺塔的实现(三步走)
- 参考视频
一、什么是汉诺塔
汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。当64片黄金圆盘被移完到另一个柱子时,那时世界也就毁灭了,为什么那时时间就毁灭呢?看完你就知道了
解释一下: 汉诺塔就是把所有圆盘都移到另一个柱子上,如图上把所有圆盘移到B柱也行,C柱也行,移动得满足两个要求:1.每次移动只能移一片, 2. 小片在上大片在下。
二、汉诺塔的规律是什么
通过了上面的解释我们了解到了汉诺塔的要求,那么我们来看一下汉诺塔的圆盘数量为1、2、3时,他的过程是怎么样的。目的:把圆盘从A柱移动到C柱
图文移动过程详解:
从移动次数我们可以看出一个规律就是:
当圆盘个数为1时,移动1次
2时,移动3次
3时,移动7次,
当圆盘个数为n时,他就移动了2^n -1次
三、汉诺塔的实现(三步走)
实现汉诺塔看上面的图文详解容易乱,上面图文详解的过程我们拿到最后去验证我们代码结果的对错,我们可以把大事化小,把n-1个圆盘看做是一个整体,移动这个整体来实现就是我们递归思想,我们分三步走,盘子个数为n,当n=3时,我们怎么分去分三步走?看如下图文:
理解了上面的三步走我们试试在代码中去实现他,看一下代码是如何去实现的:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void move(char pos1, char pos3)//一次移动过程
{
printf(" %c->%c", pos1, pos3);
}
//n是圆盘个数
//pos1为A柱
//pos2为B柱
//pos3为C柱
void Hanoi(int n, char pos1, char pos2, char pos3)//汉诺塔实现
{
if (1 == n)
{
move(pos1, pos3);
}
else//当盘子个数不等于1时,三步走
{
Hanoi(n - 1, pos1, pos3, pos2);//圆盘从pos1移动到pos2,pos3是中转柱
move(pos1, pos3);//移动一次,圆盘从pos1直接移动到pos3
Hanoi(n - 1, pos2, pos1, pos3);//n-1个圆盘从pos2,移动到pos3,pos1为中转柱
}
}
int main()
{
int n = 0;
char pos1 = 0;
char pos2 = 0;
char pos3 = 0;
printf("圆盘个数为1个时移动过程:");
Hanoi(1, 'A', 'B', 'C');//圆盘个数为1个时移动过程
printf("\n");
printf("圆盘个数为2个时移动过程:");
Hanoi(2, 'A', 'B', 'C');//圆盘个数为2个时移动过程
printf("\n");
printf("圆盘个数为3个时移动过程:");
Hanoi(3, 'A', 'B', 'C');//圆盘个数为3个时移动过程
printf("\n");
return 0;
}
我们来看看打印n=1和n=2,n=3的结果:
与上面最上面那张图文一步步移动的过程是一致的,说明我们汉诺塔的实现是成功的
最后我们回答一下最初那个悬念,为什么大梵天为什么会认为当64个圆盘完全移动到另一柱时世界就毁灭了呢?那是因为移动完64个圆盘就是移动2^64-1步,相当于1.8 * 10^19次方步,假设你移一步的速度很快一秒一步,换算下来也要5800亿年,宇宙形成到现在才138亿年,所以到那时候世界变啥样都不知道咯。
四、参考视频
我学汉诺塔时,看的两个视频我觉得帮助很大,推荐给你们看看:
第一个是李永乐老师的,第二个是比特大博哥的给他两点个赞讲的是真不错