汉诺塔问题在编程这个领域内可以算是一个老掉牙的问题了,但是它是一个很好的学习例子,作为以为编程的菜鸟,我也必须要搞定它才是!
据传说,当64层汉诺塔从a塔挪到c塔时,那将是世界末日!!!关于汉诺塔的玩法不会的去找度娘!
言归正传,回归问题。
递归,当然要用递归!递归是把最复杂的问题转换成最简单的情况,汉诺塔游戏中什么是最简单的情况?当然是塔层只有1的情况了?所以递归的终止条件就出来了!!
再进行分析,欲将n个盘子按照汉诺塔的规则从a塔借助b塔挪到c塔!
第一步,将a塔中上面的n-1个盘子挪到b塔中;
第二部,将a塔中地n个盘子挪到c塔中;
第三步,将b塔的n-1个盘子挪到c塔中。
结束! 就是这个步骤! 是不是感觉第一步和第三步完全是扯淡? 不是扯淡,这正是利用递归解决汉诺塔问题的核心!
下面继续分析,第一步中,将a塔中上面的n-1个盘子挪到b塔,需要怎么挪?
是不是需要利用c塔呢? 没错,欲将a塔中n-1个盘子借助c塔挪到b塔中,需要以下三步:
第1步:将a塔中上面的n-2个盘子,挪到c塔中;
第2部:将a塔中第n-1个盘子挪到b塔中;
第3步:将c塔中n-2个盘子挪到b塔中。
看出来没有在第一次分析时的第一步和第三步完全有是一个汉诺塔问题,所以利用递归和分治思想这个问题其实在地刺分析时就已经得到答案了!!!
看代码:
#include <stdio.h>
#include <stdlib.h>
void hanoi(int n,char a,char b,char c)
{
if (n==1)
{
printf("%c-->%c\n",a,c); //结束条件,只有一个盘子的情况
}
else
{
hanoi(n-1,a,c,b); //递归将a塔中n-1个盘子借助c塔挪到b塔中
printf("%c-->%c\n",a,c); //由于a塔中只有一个盘子,符合汉诺塔规则,所以打印出来
hanoi(n-1,b,a,c); //递归将b塔中n-1个盘子借助a塔挪到c塔中
}
}
int main(void)
{
int n;
printf("请输入汉诺塔的层数:");
scanf("%d",&n);
printf("具体步骤如下:\n");
hanoi(n,'a','b','c');
system("pause");
return 0;
}
所以结果也必然是正确的!!!!
输入:4
输出结果:
希望对每一个看到的童鞋都有帮助,谢谢!!