规定:
将 A 柱的圆盘按大小顺序重新摆放在 C 柱上,但是小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
思路:
不管 A 柱上有多少个圆盘,只考虑一个圆盘和多个圆盘的情况,将 A 柱上的 n-1 个圆盘当成一个整体。
先把 A 柱上的 n - 1 个圆盘通过 C 柱移动到 B 柱上
再把 A 柱上的圆盘移动到 C 柱上(这一步是固定的)
最后将 B 柱上剩余的 n-1 圆盘通过 A 柱移动到 C 柱上,完成一个循环
所以提供一个方法,参数是三个柱子的位置和 A 柱的圆盘数量,先判断是否只剩一个圆盘,如果只剩一个圆盘,那么就把这个圆盘直接移动到 C 柱上。多个圆盘则走上面的逻辑直至移动完所有圆盘为止。
代码实现:
public class Hanoi {
public static void main(String[] args) {
Tower tower = new Tower();
tower.move01(3, 'A', 'B', 'C');
}
}
class Tower {
/**
* 移动圆盘的方法, 将位置a上的圆盘移动到位置c上
*
* @param num 位置a的圆盘数
* @param a 位置a
* @param b 位置b
* @param c 位置c
*/
public void move01(int num, char a, char b, char c) {
if (num == 1) {// 一个圆盘的情况
System.out.println(a + "--->" + c);
} else {// 多个圆盘的情况
// 先把 A 柱上的 n - 1 个圆盘通过 C 柱移动到 B 柱上
move01(num - 1, a, c, b);
// 再把 A 柱上的圆盘移动到 C 柱上(这一步是固定的)
System.out.println(a + "--->" + c);
// 最后将 B 柱上剩余的 n-1 圆盘通过 A 柱移动到 C 柱上,完成一个循环
move01(num - 1, b, a, c);
}
}
}
运行结果:
A--->C
A--->B
C--->B
A--->C
B--->A
B--->C
A--->C