问题描述
有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,并且每次移动,同一根柱子上都不能出现大盘子在小盘子上方,输出每次的移动。
可以化繁为简来看
如果只有一个盘子,那么只需要从A塔移动到C塔
如果有两个盘子,需要将最上面的盘子移动到B塔,再将最下面的盘子移动到C塔,最后把B塔上的盘子移动到C塔
把n个盘子看作两个盘子,最下面的是一个盘子,上面所有的是一个盘子
1.先移动上面所有的盘子到B,借助C
2.把最下面的盘,移动到C
3.再把B塔所有的盘子,移动到C,借助A
代码实现:
public class HanoiTower {
public static void main(String[] args) {
Tower tower = new Tower();
tower.move(1,'A','B','C');
}
}
class Tower {
//方法
//num 表示要移动的个数, a, b, c分别表示A塔, B塔, C塔
public void move(int num, char a, char b, char c) {
//如果只有一个盘 num = 1
if (num == 1) {
System.out.println(a + "->" + c);
} else {
//如果有多个盘,可以看成两个,最下面的和上面的所有盘(num-1)
// (1)先移动上面所有的盘到 b ,借助 c
move((num - 1), a, c, b);
// (2)把最下面的盘,移动到 c
System.out.println(a + "->" + c);
// (3)再把 b塔的所有盘,移动到c,借助a
move((num - 1), b, a, c);
}
}
}
输出的结果
当num=4时