汉诺塔问题是法国数学家Edouard Lucas发明的。具体可以描述为有三根木桩,初始的时候有n个盘子,最底层的盘子最大,最上层的盘子最小,按大小顺序依次放在第一根木桩上,然后以第二根木桩作为桥梁,全部搬到第三根木桩。
移动木桩的时候需要注意:
1.每次只能移动一个盘子。
2.大盘子必须放在小盘子下面。
基本算法思想:
1.将n-1个盘子,从木桩1移到木桩2。
2.将第n个盘子,从木桩1移到木桩3。
3.将n-1个盘子,从木桩2移到木桩3。
/*
* 将n个盘子由初始木桩移动到目标木桩(利用借用木桩)
*/
public void hanoi(int n, char from, char denpend_on, char to) {
if (n == 1)
// 只有一个盘子是直接将初始木桩上的盘子移动到目的木桩
move(1, from, to);
else {
// 先将初始木桩的前n-1个盘子借助目的木桩移动到借用木桩上
hanoi(n - 1, from, to, denpend_on);
// 将剩下的一个盘子移动到目的木桩上
move(n, from, to);
// 最后将借用木桩上的n-1个盘子移动到目的木桩上
hanoi(n - 1, denpend_on, from, to);
}
}
/*
* 将编号为n的盘子由from移动到to
*/
private void move(int n, char from, char to) {
System.out.println("Move " + n + " from " + from + " to " + to);
}