汉诺塔定义
汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
前言
如果考虑一下把64片金片,由一根针上移到另一根针上,并且始终保持上小下大的顺序。这需要多少次移动呢?
如果考虑一下把64片金片,由一根针上移到另一根针上,并且始终保持上小下大的顺序。这需要多少次移动呢
需要移动 18446744073709551615 次
这表明移完这些金片需要5845.42亿年以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。真的过了5845.42亿年,不说太阳系和银河系,至少地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。
分析
1)可以把看门看成两个盘子,最下面一个和上面所有
2)如果有一个盘子,从 A 移动到 C即可
否则
3)把 A 除最下面的盘移动到 B,借助 C
4)把 A 最下面的盘移动到 C
5)把 B 所有盘移动到 C
上面步骤即完成了这个问题
代码实现
// 汉诺塔
public class HanoiTower {
public static void main(String[] args) {
Tower t = new Tower();
t.move(5,'A','B','C');
}
}
class Tower {
// num为盘子数,a、b、c、分别为柱子
public void move(int num,char a,char b,char c) {
// 如果只有一个盘子
if (num == 1) {
System.out.println(a + "->" + c);
} else {
// 可以看成两个盘子,最下面一个和上面所有 ,即 (num - 1)
// (1) 先把上面所有盘子移动到 b ,借助 c
move(num - 1,a , c , b);
// (2) 把 a 最下面的盘子移动到 c
System.out.println(a + "->" + c);
// (3) 把 b 全部盘移动到 c 借助 a
move(num - 1,b , a, c);
}
}
}