汉诺塔又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
由来
法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。
实现原理:
-
把三根柱子分为:原柱,辅助柱,目标柱。
-
如果只有一个圆盘,则直接把圆盘移动到目标柱,否则进行第三步;
-
如果下方还有圆盘,则把辅助柱作为目标柱,再此进行第二步(把圆盘移动到目标柱);
-
如果只剩最后一个圆盘,则把辅助柱当作原柱,再此进行第二步操作;
-
最终重复上述操作,直到把所有圆盘含顺序摆放到目标柱。
#include <stdio.h>
void hanoi(int n, char src, char dest, char aux) // 圆盘数量、原柱、目标柱、辅助柱
{
if (n == 1)
{
printf("move disc %d from %c to %c\n", n, src, dest);
return;
}
hanoi(n - 1, src, aux, dest);
printf("move disc %d from %c to %c\n", n, src, dest);
hanoi(n - 1, aux, dest, src);
}
int main()
{
int n;
printf("请输入圆盘数量:\n");
scanf("%d", &n);
hanoi(n, 'A', 'C', 'B');
return 0;
}