#include <stdio.h>
int Hanoi(int Number, char startColumn, char passColumn, char endColumn)
{
if (Number == 1)
{
printf("从%c柱移动到%c柱子\n",startColumn,endColumn);
return 0;
}else{
Hanoi(Number-1,startColumn,endColumn,passColumn);
printf("从%c柱移动到%c柱子\n",startColumn,endColumn);
Hanoi(Number-1,passColumn,startColumn,endColumn);
}
}
void hanoiTest()
{
printf("--------汉诺塔测试--------\n\n");
printf("--------测试1--------\n");
Hanoi(1,'A','B','C');
printf("--------测试2--------\n");
Hanoi(2,'A','B','C');
printf("--------测试3--------\n");
Hanoi(3,'A','B','C');
}
int main()
{
hanoiTest();
}
三层汉诺塔的解答思路:第一轮先把x和y通过C柱都堆叠到B柱上
第二轮把z从A柱移动到C柱上
第三轮把x和y通过A柱移动到C柱子上,完成汉诺塔的三层问题。
通过三层的汉诺塔问题,也可以解决n层的汉诺塔问题
如果在A柱上有n层,那么可以先把上面的n-1层当作一个整体x,而在上面n-1层的整体中,又可以将最下一格和上面的n-2格分为2个整体,通过递归的思想,先将问题层层”递“上去,最后变成了最上面的一层和最上面的第二层两个整体,于是第一层开始动,接着把”递“上去的问题再一层一层”归“下来,将上面n-1层通过C柱,转移到B柱,即完成了汉诺塔问题的第一轮,于是A柱中的第n层可以移动到C柱子,即完成了汉诺塔问题的第二轮,最后则是把原本上面的n-1层通过A柱转移到C柱,完成汉诺塔问题的第三轮
n = 1
时,- 直接把盘子从 A 移到 C;
n > 1
时,- 先把上面 n - 1 个盘子从 A 移到 B(子问题,递归);
- 再将最大的盘子从 A 移到 C;
-
再将 B 上 n - 1 个盘子从 B 移到 C(子问题,递归)。