文章目录
- 汉诺塔问题
今天和大家来看看汉诺塔问题,这也是一个经典的算法
汉诺塔问题
分治算法经典问题:汉诺塔问题
汉诺塔的传说
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着 64 片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
假如每秒钟一次,共需多长时间呢?移完这些金片需要 5845.54 亿年以上,太阳系的预期寿命据说也就是数百亿年。真的过了 5845.54 亿年,地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。
体验完后,我们来整理下移动盘子的思路(假设有A、B、C柱子):
1、如果只有一个盘,直接可以A->C
2、如果盘子的数量 n >= 2,我就可以看做是两个盘子。。
- 最下边(最大)的盘
- 上面的盘
因此就可以走三部曲
先把最上面的盘A->B
把最下边的盘A->C
把B塔的所有盘从B->C
代码示例:
/**
* 汉诺塔问题解决
* @param discNum 盘子数量
* @param a A柱子
* @param b B柱子
* @param c C柱子
*/
public static void towerOfHanoi(int discNum, char a, char b, char c) {
// 如果只有一个盘
if (discNum == 1) {
System.out.println("第1个盘" + a + "->" + c);
} else {
// 盘的数量 >= 2
// 1.上盘A->B
towerOfHanoi(discNum - 1, a, c, b);
// 2.下盘A->C
System.out.println("第" + discNum + "个盘" + a + "->" + c);
// 3.把B柱子的所有盘子移至C柱子
towerOfHanoi(discNum - 1, b, a, c);
}
}