寒假打算码一遍数据结构(浙大版)上的代码,遇到了以前没弄懂的汉诺塔问题,后面上B站搜索看了一下教程,遇到一个讲的比较好的视频,感兴趣的可以自己看下(网址https://www.bilibili.com/video/BV1gt411P7yW)。这篇博文实际上不太涉讲解,即使涉及了,也会比较浅,说白了只是一篇我回顾复习的博文。
思路推导:
从两个圆盘开始,假设三根插柱分别为 A B C,目标柱为C,那么辅助柱为B,(当然了也可以目标柱为B,辅助柱为C)。
首先将小的移动到B ,然后将大的移动到C,再然后移动小的到C
至此两块圆盘的情况讲解完成。
接下来,三块呢?
我们参照上述二个圆盘的思路,将三块分为两组,最大的为一组,中和小为一组,分别对应着两个圆盘情况时的大圆盘,小圆盘,也就是说,将大圆盘看成一个整体,中圆盘和小圆盘看成一个整体。
我们知道两块圆盘时的思路:
首先将小的移动到B ,然后将大的移动到C,再然后移动小的到C
按照这个思路走,
首先将小的移动到B:这里的小 实际包含两个圆盘,而两个圆盘的移动的思路本来我们就已经知道了,
因为是从A移动到B,显然辅助柱只能是C, 首先将小的移动到C, 然后将大的移动到B,再然移动小的到B(这里的大小对应着中小,为了体现递归的本质,我用了大小而不是中小),此时完成了将两块圆盘移动到B。
然后将大的移动到C:这里不做过多解释……因为就一个盘
再然后移动小的到C:因为是从B移动到C,所以辅助柱是A。这里我用中小来讲解,首先移动小的到A,然后移动中盘到C,再然后移动小盘到C。
至此,三块圆盘移动完成。
四块呢?
大概讲下,四块分成 两份, 最大的一份,其余三块一份。 然后以C为目标柱的话,先把三块移动到B,再移动单独那块到C,最后移动那三块到C。然后移动三块哪里又可以参照上文的……如此递归!
最后附上代码
#include<stdio.h>
//这里以a为初始柱,c为目标柱
void hanoi(int n,char a, char b ,char c)//分别对应圆盘数,插柱。插柱分别为初始位置,辅助位置,目标位置
{
if(n>0)
{
hanoi(n-1,a,c,b);
printf("从%c柱拿出一块移动到%c柱\n",a,c);
hanoi(n-1,b,a,c);
}
}
int main()
{
int n;
scanf("%d",&n);
char a='A',b='B',c='C';
hanoi(n,a,b,c);
return 0;
}
本文详细介绍了汉诺塔问题的解决思路,从两个圆盘的简单情况开始,逐步递归至三个及更多圆盘的情况。通过分解问题并利用递归算法,作者给出了C语言的代码实现,帮助读者理解这一经典问题的解决方案。
1万+





