汉诺塔解析
汉诺塔:
法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。
先看一下汉诺塔的小故事。
下面说一下汉诺塔问题的解决思路。
汉诺塔问题是一个典型的递归问题,该问题可以分为两个小步,根据题可以知道汉诺塔问题有三个铁棒解决解决问题的方法就是来回移动这三个铁棒。我看了很多该问题的文章,总结出以下这个解决问题的思路。
第一步就是利用c棒将将输入小一阶的挪动到b棒,第二小步就是利用a棒将小一阶的重新挪回到c帮,中间有b棒的插入我们可以用一步将最高阶的挪动到c棒上,这是这两步中间多出的一步奏。接下来先看代码。
# include <stdio.h>
int ans;
void move(){
ans++;
}
void hannota(int n,char a,char b,char c){
//为了更容易理解加上了三棒
if(n == 1){
ans++;
}
else{
hannota(n-1,a,c,b);
move();
hannota(n-1,b,a,c);
}
}
int main(void){
int e;
scanf("%d",&e);
hannota(e,'a','b','c');
printf("%d",ans);
return 0;
}
http://www.hannuota.cn/
这是一个汉诺塔小游戏的链接读者们可以体验下3个棒的游戏过程,再去思考4个棒会不会因为刚好多一介将棒直接的利用关系打乱呢?
经过我的一些测试3个棒的最小步骤是7,4个棒是15,5个棒是31,有没有发现什么规律,为什么会出现这样的结果呢?留给读者们去思考。