今天又想了想汉诺塔问题,再次想的时候还是感觉有点吃力,所以我又写了这一篇文章来梳理一下思路,同时又看看能不能帮到你们。
汉诺塔问题来自一个古老的传说:在世界刚被创建的时候有一座钻石宝塔(塔A),其上有64个金碟。所有碟子按从大到小的次序从塔底堆放至塔顶。紧挨着这座塔有另外两个钻石宝塔(塔B和塔C)。从世界创始之日起,婆罗门的牧师们就一直在试图把塔A上的碟子移动到塔C上去,其间借助于塔B的帮助。每次只能移动一个碟子,任何时候都不能把一个碟子放在比它小的碟子上面。当牧师们完成任务时,世界末日也就到了。
首先就是老套到不能再老套的一个思路:
(1)将塔A上的n-1个碟子借助塔C先移到塔B上。
(2)把塔A上剩下的一个碟子移到塔C上。
(3)将n-1个碟子从塔B借助于塔A移到塔C上。
不过就我而言,刚开始看的时候怎么也想不明白为什么短短的一段代码能实现这么多的功能。而且我在看完这段代码后明显有点不知所措。
#include <stdio.h>
void hannuota(int n,char a,char b,char c);
int main(){
int n;
scanf("%d",&n);
char a,b,c;
a='A';
b='B';
c='C';
hannuota(n,a,b,c);
return 0;
}
void hannuota(int n,char a,char b,char c){
if(n==1){
printf("%c->%c\n",a,c);
}
else {
hannuota(n-1,a,c,b);
printf("%c->%c\n",a,c);
hannuota(n-1,b,a,c);
}
}
对于递归类型的问题,首先得找出口,最后的出口就是A上面只有编号最大的那一块砖移动到C上面,这个时候我们以a为起点,以c为终点进行移动,所以就写出来了n==1的情况,下面n不是1的情况,这个时候我们需要把A n-1块砖头通过c,移动到b,所以起点是a,终点是b,中介点是c,hannuota(n-1,a,c,b);紧接着我们需要把A上面最后一块砖移动到c上面,所以就是下一步的printf("%c->%c\n",a,c);最后为了实现闭合状态,就是让他重复一次循环,这个时候在b上的一摞砖就相当于一个n-1块砖在A上面的一个新问题,也就是以b为起点,a为中介点,c为终点的新的过程。(可能算是强行解释了,有什么好的理解方法可以交流一下)