最近在研究数据结构,书中提到了汉诺塔这一问题,由于代码太过简介,所以看懂这段代码花费了我一点时间,现在我把分析过程分享出来,便于新手朋友理解。
首先,先解释一下什么是汉诺塔:
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
然后,代码分析(分析过程已在代码中注释)
package ch03;
public class Example3_4 {
// c为移动次数
private int c = 0;
// 构造汉诺塔
// 参数一:圆盘序号
// 参数二:原塔(初始时,圆盘所在的塔)
// 参数三:辅助塔
// 参数四:目标塔(圆盘最终需要移动到的塔)
public void hanoi(int n, char x, char y, char z) {
// 如果圆盘序号为1,只需移动一次即可到达目标盘
if(n == 1) {
move(x, 1, z);
}
// 如果圆盘序号大于1,则需要借助辅助塔,将其它盘移走
// 移动步骤:
// 1.将压在目标圆盘之上的所有圆盘移动到辅助塔(这时,以目标塔作为辅助塔)
// 2.将目标圆盘移动到目标塔上
else {
// 将序号为1到n-1的圆盘,从原塔x,借助辅助塔z,移动到塔y上
hanoi(n - 1 , x, z, y);
// 将序号为n的圆盘从x塔移动到z塔(目标塔)
move(x, n, z);
// 更新汉诺塔(由于移动,此时x塔已为空塔,在接下来的操作中,我们可以把它当做辅助塔)
// 将序号为1到n-1的圆盘,从原塔y,借助辅助塔x,移动到塔z上
// 注意:z塔为最终的目标塔
hanoi(n - 1, y, x, z);
}
}
// 移动圆盘
// 参数一:原塔
// 参数二:圆盘序号
// 参数三:目标塔
public void move(char x, int n, char z) {
// 日常输出
System.out.println("第" + ++c + "次移动:" + n + "号圆盘," + x + "->" + z);
}
public static void main(String[] args) {
Example3_4 e = new Example3_4();
e.hanoi(4, 'x', 'y', 'z');
}
}