1.問題描述:
有一個梵塔,塔內有A、B、C三個座,A座上有很多個盤子,盤子大小不等,大的在下,小的在上。我們要把這些盤子從A座移到C座,中間可以借用B座但每次只能允許移動一個盤子,并且在移動過程中,3個座上的盤子始終保持大盤在下,小盤在上。
具體如下圖:
2.問題分析:
我們先假設有n個盤子,并且從1到n編上號,盤子的大小和編號對應。編號越大,盤子也越大。首先,無論我們怎么移動座上的盤子都要遵守一個規則,即:大盤在上,小盤在下!所以最先完成從A座到C座的盤子一定是最大的,即n號盤。所以可以分為三步:
1.將1~n號盤子從A座移動到B座;
2.將n號盤子從A座移動到C座;
3.將1~n號盤子從B座移動到C座;
注意:當n==1時,我們直接從A座移動到C座可以了。
所以我們的第一步(將1-n號盤子從A座移動到B座)又可以細分為三個步驟:
1.將1~(n-1)號盤子從A座移動到C座;
2.將n-1號盤子從A座移動到B座;
3.將1~(n-1)號盤子從C座移動到B座;
這時我們可以發現,細分之后的結果本質上和原來沒有區別,只是目標座和借助座發生了改變。因此只要盤子的個數不等于1,我們就可以說完成移動的過程就是在重復這三個步驟。所以Hanoi Tower問題可以用遞歸解決。
3.Java代碼
class test
{
public static void main (String[] args) throws java.lang.Exception
{
test t = new test();
t.hanoiTower(n,'A','B','C');
}
void hanoiTower(int n, char src, char mid, char des){
if(n==1){
System.out.println(n + ": " + src + " -> " + des);
}
else{
hanoiTower(n-1,src,des,mid);
System.out.println(n + ": " + src + " -> " + des);
hanoiTower(n-1,mid,src,des);
}
}
}
在hanoiTower(int n, char src, char mid, char des)方法中,n表示盤子的個數,src代表初始座,mid代表借助的座,des代表目的座。
當輸入n==3時,輸出結果如下:
1: A -> C
2: A -> B
1: C -> B
3: A -> C
1: B -> A
2: B -> C
1: A -> C