汉诺塔(Hanoi Tower)又称作河内塔,在印度神话传说中,大梵天创造世界是建造了三根金刚石柱,在其中一根柱子上有64个大小不一的黄金圆盘,大圆盘放在了小圆盘下面。大梵天让婆罗门将圆盘从一根柱子转移到另一根柱子,转移过程中每次只能转移一个圆盘,且大圆盘要始终在小圆盘的下面。
假设三根柱子的编号分别是A,B,C。A柱为起始柱,B柱为中间柱,C柱为目标柱。
当汉诺塔只有1层时,将圆盘从起始柱(A柱)直接转移到目标柱(C柱)即可完成任务。
当汉诺塔有2层时,可以将小圆盘移到中间柱(B柱)上,剩下的大圆盘重复只有一层的动作(从起始柱(A柱)移到目标柱(C柱)),最后将小圆盘从中间柱(B柱)移到目标柱(C柱)。
当汉诺塔的层数为3层时,移动起来就比较麻烦了。首先最小的圆盘应该先移到B柱还是C柱,移到不同 的柱上结果是不一样的。现在我们换一种思路,要求是小圆盘在大圆盘上面,大圆盘肯定要放在目标柱(C柱)的最底下。我们可以考虑一下先把起始柱(A柱)上的上面两个圆盘放到中间柱(B柱)上,然后把起始柱(A柱)的大圆盘移到目标柱(C柱)上。此时,中间柱(B柱)有两个圆盘,目标柱(C柱)有一个最大的圆盘,现在我们将中间柱(B柱)看做是起始柱,将起始柱(A柱)看做中间柱,问题就回到了两个圆盘的时候,就可以用两个圆盘的移法来解决这个问题。
由上述问题可以推出,当汉诺塔的层数为n层时,我们可以将其一层一层的简化,现在忘掉A,B,C柱。首先将n-1层看做一个整体,将其从起始柱移到中间柱,将第n个圆盘移到目标柱,随后将中间柱看做起始柱,起始柱看做中间柱,将第n-1个圆盘放到目标柱。随后一直递减,直到剩一个圆盘,从起始柱移入目标柱。
其中就用了递归思想。
代码如下:
#include<stdio.h>
void move(int n, char P1, char P3)
{
printf("第%d个盘:%c-->%c\n",n,P1,P3);
}
void Hanoi(int n, char P1, char P2, char P3) //P1为起始柱,P2为中间柱,P3为目标柱。
{
if(n ==1)
{
move(n, P1, P3);
}
else
{
Hanoi(n-1, P1, P3, P2); //将前n-1个圆盘由起始柱转到中间柱。
move(n, P1, P3); //将第n个圆盘由起始柱转到目标柱。
Hanoi(n-1, P2, P1, P3); //将前n-1个圆盘由中间柱转到目标柱。
}
}
int main()
{
int n; //n为汉诺塔的层数。
printf("请输入层数:");
scanf("%d",&n);
Hanoi(n, 'A', 'B', 'C');
return 0;
}