汉诺塔
汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?
汉诺塔问题可以通过以下几个步骤来解决这个问题:
首先,我们把三根金刚石柱子编号为A、B、C,其中编号为A的柱子摞着64片黄金圆盘,B、C为空柱,其中,C柱子作为最终摆放圆盘的柱
- 首先,我们可以把64个黄金圆盘看作由两个部分组成 :第64个黄金圆盘和其上的63个黄金圆盘 ,这样我们只要把63个黄金圆盘组成的部分移到编号为B的柱子,然后就可以将第64个黄金圆盘移到C柱上。
- 同样,我们也可以把编号为B柱上的63个黄金组成的部分再次分为两个部分,第63个黄金圆盘和其上的62个黄金圆盘,这时,借助编号为A的柱子,将62个黄金圆盘移到A柱上。然后,在把第63个黄金盘移到C柱上,依此类推,这样我们就可以将剩下的黄金圆盘都移到C柱上。
#include <stdio.h>
/* n 为黄金圆盘的盘数
A 为原来摞着64片黄金圆盘柱
B 为中间空柱
C 为摞64片黄金圆盘目标柱
*/
void hanoi(int n, char A, char B, char C)
{
if (n == 1)
{
printf("%c -> %c\n", A, C);
return;
}
hanoi(n-1, A,C, B); //把n-1个盘子,从A移动到B,中间可以利用C
printf("%c -> %c\n", A, C); //把剩下的那个盘子,从A移动到C
hanoi(n-1, B, A, C); //把n-1个盘子,从B移到C,中间可以利用A
}
int main()
{
hanoi(64, 'A', 'B', 'C');
return 0;
}