汉诺塔问题
一、什么是汉诺塔?
汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
二、分析:用递归求解汉诺塔问题(Java)
2.1 情况一:只有 1 个圆盘
如图:
挪动前:
挪动过程: 这种情况非常简单,只需要直接把圆盘从起始位置 A 挪动到目的位置 C 即可!
挪动后:
过程:A->C
2.2 情况二:有 2 个圆盘
如图:
挪动前:
挪动过程:
我们需要先把绿色圆盘挪到 B
再将红色圆盘挪到 C
最后再将绿色圆盘挪到 C
过程:A->B A->C B->C
2.3 情况三:有 3 个圆盘
如图:
挪动前:
挪动过程:
先把蓝色圆盘挪到 C
再将绿色圆盘挪到 B
再将蓝色圆盘挪到 B
将红色圆盘挪到 C
将蓝色圆盘挪到 A
将绿色圆盘挪到 C
将蓝色圆盘挪到 C
过程:A->C A->B C->B A->C B->A B->C A->C
2.4 有 n 个圆盘
这里以 4 个圆盘为例,4个盘子画图是比较困难的,但我们可以采用一种大事化小的方法解决
挪动前:
通过上边例子我们可以知道,除了最下边的圆盘,其他的盘子都是通过B,再挪到C的,因此n个盘子,我们也是要把上边 n-1 个盘子先挪到B,如图:
之后我们就可以将红色的盘子直接挪到C了,剩下在B柱子上的盘子和上边的例子一样,都是通过A柱最后移动到C柱上,这就是大事化小的思想!
三、代码的实现
public class TowerOfHanoi {
//打印过程
public static void move(char pos1, char pos2) {
System.out.print(" " + pos1 + "->" + pos2 +" ");
}
/**
* @param n 盘子数量
* @param pos1 起始位置
* @param pos2 中转位置
* @param pos3 目标位置
*/
public static void hanoi(int n, char pos1, char pos2, char pos3) {
if (n == 1) {
move(pos1, pos3);
} else {
hanoi(n - 1, pos1, pos3, pos2);
move(pos1, pos3);
hanoi(n - 1, pos2, pos1, pos3);
}
}
public static void main(String[] args) {
hanoi(3,'A','B','C');
}
}
以3个盘子为例子,输出结果就是:
和我们上边分析的结果一样!
那么4个盘子呢?结果就是
可以说手动挪起来是比较复杂了,但通过计算机我们可以很快的得出结果,要注意的是,盘子数量越多,计算机运行的时间也会越长!!!
以上就是汉诺塔问题的全部内容了,如果有问题欢迎私信!!!