漢諾塔問(wèn)題是法國(guó)數(shù)學(xué)家Edouard Lucas發(fā)明的埃碱。具體可以描述為有三根木樁,初始的時(shí)候有n個(gè)盤(pán)子酥泞,最底層的盤(pán)子最大砚殿,最上層的盤(pán)子最小,按大小順序依次放在第一根木樁上芝囤,然后以第二根木樁作為橋梁似炎,全部搬到第三根木樁辛萍。
移動(dòng)木樁的時(shí)候需要注意:
1.每次只能移動(dòng)一個(gè)盤(pán)子。
2.大盤(pán)子必須放在小盤(pán)子下面羡藐。
基本算法思想:
1.將n-1個(gè)盤(pán)子贩毕,從木樁1移到木樁2。
2.將第n個(gè)盤(pán)子仆嗦,從木樁1移到木樁3辉阶。
3.將n-1個(gè)盤(pán)子,從木樁2移到木樁3欧啤。
/*
* 將n個(gè)盤(pán)子由初始木樁移動(dòng)到目標(biāo)木樁(利用借用木樁)
*/
public void hanoi(int n, char from, char denpend_on, char to) {
if (n == 1)
// 只有一個(gè)盤(pán)子是直接將初始木樁上的盤(pán)子移動(dòng)到目的木樁
move(1, from, to);
else {
// 先將初始木樁的前n-1個(gè)盤(pán)子借助目的木樁移動(dòng)到借用木樁上
hanoi(n - 1, from, to, denpend_on);
// 將剩下的一個(gè)盤(pán)子移動(dòng)到目的木樁上
move(n, from, to);
// 最后將借用木樁上的n-1個(gè)盤(pán)子移動(dòng)到目的木樁上
hanoi(n - 1, denpend_on, from, to);
}
}
/*
* 將編號(hào)為n的盤(pán)子由from移動(dòng)到to
*/
private void move(int n, char from, char to) {
System.out.println("Move " + n + " from " + from + " to " + to);
}