用什麼語言解法都差不多,思路都是一樣,遞歸,這其中只要注重於開始和結果的狀態就可以了,對於中間過程,並不需要深究。(我細細思考了一下,還是算了。=_=)
代碼其實很簡單注重的是思路。
問題描述:有一個梵塔,塔內有三個座A、B、C,A座上有諾干個盤子,盤子大小不等,大的在下,小的在上。把這些個盤子從A座移到C座,中間可以借用B座但每次只能允許移動一個盤子,並且在移動過程中,3個座上的盤子始終保持大盤在下,小盤在上。
簡要概括一下,每次只能移動一個盤子,小盤子不能被大盤子壓著,源座是A、目標座是C,過渡座是B。
嗯,問題很明確,下面開始分析。
我思考的過程是,先考慮一下最簡單的情況,即只有一個盤子(n=1),一個盤子很好解決,A——>C即可;當盤子數(n)為不確定的個數的時候,這時候,我們寫一個方法,將(n-1)個盤子按規則移動到B盤,那麼A盤上剩下的必然是最大的盤子,A——>C直接移動到C盤即可;那麼現在B盤上有(n-1)個盤子,為了讓這n-1個盤子中的最大的那個盤子移動到C盤,我們寫一個方法將(n-2)個盤子按規則移動到A盤,而B座上剩下(n-1)中最大的盤子,將這個盤子移動到C盤;此時A上面有(n-2)個盤子,我們寫一個方法將(n-3)個盤子移動到C盤...
那麼現在解法很明了了,後面不過是重復上訴步驟而已了,函數體沒變,只是目標座和過渡座變化了而已。
沒有必要去深究這中間的過程,如果從一開始去深究,n個盤子,每一個盤子的軌跡的話,那麼只能是越陷越深,有時候也是要換一個角度去考慮問題。
廢話不說了,直接上代碼:
public class hanoi {
public static void main(String[] args){
hanoi h = new hanoi();
h.move(3, 'A', 'B', 'C');
}
public void move(int n,char a,char b,char c){
if(n == 1){
System.out.println("Disk "+n+" From "+a+" To "+c);
}else{
move(n - 1,a,c,b);
System.out.println("Disk "+(n-1)+" From "+a+" To "+c);
move(n - 1,b,a,c);
}
}
}
嗯,以上。