漢諾塔問題是法國數(shù)學(xué)家Edouard Lucas發(fā)明的。具體可以描述為有三根木樁,初始的時候有n個盤子,最底層的盤子最大,最上層的盤子最小,按大小順序依次放在第一根木樁上,然后以第二根木樁作為橋梁,全部搬到第三根木樁。
移動木樁的時候需要注意:
1.每次只能移動一個盤子。
2.大盤子必須放在小盤子下面。
基本算法思想:
1.將n-1個盤子,從木樁1移到木樁2。
2.將第n個盤子,從木樁1移到木樁3。
3.將n-1個盤子,從木樁2移到木樁3。
/*
* 將n個盤子由初始木樁移動到目標(biāo)木樁(利用借用木樁)
*/
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);
}