一、汉诺塔是什么
汉诺塔有三个柱子A,B,C。首先在A上有n个从上往下圆盘大小依次增加的圆盘,我们需要把A柱子的圆盘按照相同的顺序转移到C柱子。同时在转移的过程中,小的圆盘也只能在大的圆盘上面。
二、分步理解汉诺塔
当A柱只有1个圆盘时,我们只需要将这个圆盘直接移动到C柱即可。
当A柱有2个圆盘时,我们要借助B柱,首先将盘1从A移动到B,接着把盘2从B移动到C,最后把盘1从B移动到C。
当A柱有3个圆盘时,我们需要如下图所示的步骤。
对此我们进行总结,我们在移动圆盘的过程中,先把第1个和第2个圆盘当作一个整体,移动到B柱,再把第3个圆盘移动到C柱,然后再把第1个圆盘移动到A柱,最后完成移动。
因此我们类比,我们有n个圆盘,我们把n-1个圆盘当作整体,移动到B柱,再把第n个圆盘移动到C柱子,再把n-2个圆盘当作整体,从B柱移动到A柱,再把第n-1个圆盘移动到C柱,依次类推,就可以完成我们的汉诺塔了。
三、代码的实现
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void hanoi(char A, char B, char C, int n) //我们需要A,B,C三个柱子以及圆盘的个数n作为变量
{
if (n == 1)
{
printf("%c----->%c\n", A, C);//这里进行判断,如果只有一个圆盘,只需要一次移动即可
}
else
{
hanoi( A,C,B,n-1);//这里我们把n-1个圆盘当作整体,把它们从A柱移动到C柱
printf("%c----->%c\n", A, C);//我们把第n个圆盘(C柱以外最大的圆盘)移动到C柱
hanoi(B,A,C,n - 1);//这里把B的n-1个圆盘移动到C柱
}
}
int main()
{
hanoi('A', 'B', 'C', 3);
return 0;
}
输出结果:
这个函数的执行结果如下图。