携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第一天,点击查看活动详情
汉诺塔
汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按照大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
- 当n=1时:
- 移动1 方向 A—>C;
- 移动一次
- 移动1 方向 A—>C;
- 当n=2时:
- 移动1 方向 A—>B;
- 移动2 方向 A—>C;
- 移动1 方向 B—>C;
- 移动三次
- 当n=3时:
- 移动1 方向 A—>C;
- 移动2 方向 A—>B;
- 移动1 方向 C—>B;
- 移动3 方向 A—>C;
- 移动1 方向 B—>A;
- 移动2 方向 B—>C;
- 移动1 方向 A—>C;
- 移动七次
我们可以发现圆盘移动是有规律的:
- 我们是把n-1个圆盘看成一个整体去分析的,
- 1>把n-1个圆盘由A移到B;
- 2>把第n个圆盘由A移到C;
- 3>把n-1个圆盘由B移到C;
那如何把n-1个圆盘从A移到B呢?(借助C塔移到了B上)
- 我们可以把n-2个圆盘看成一个整体去分析:
- 1.把n-2个圆盘由A移到C;
- 2.把第n-1个圆盘由A移到B;
- 3.把n-2个圆盘由C移到B;
那如何把n-1个圆盘从B移到C呢?(借助A塔移到了C上)
- 1.把n-2个圆盘由B移到A;
- 2.把第n-1个圆盘由B移到C;
- 3.把n-2个圆盘由A移到C;
重点:
- 中间的一步是把最大的一个盘子由A移到C上去;
- 中间一步之上可以看成把A上n-1个盘子通过借助C塔移到了B上,
- 中间一步之下可以看成把B上n-1个盘子通过借助A塔移到了C上;
ps(有些内容取自网上,若觉得侵权可以删掉)
下面是萌新写的代码:(技术很菜。。。)
#include <stdio.h>
int cnt;
void hanoi(int n, char a, char b, char c) {
if (n == 0)
return;
hanoi(n - 1, a, c, b);//将n-1个盘子由A经过C移动到B
printf ("step %d: move %d from %c->%c\n", cnt++, n, a, c);
hanoi(n - 1, b, a, c);//剩下的n-1盘子,由B经过A移动到C
}
int main() {
int n;
while( scanf ("%d", &n)) {
cnt=1;
hanoi(n, 'A', 'B', 'C');
}
return 0;
}