用什么語(yǔ)言解法都差不多,思路都是一樣,遞歸,這其中只要注重于開始和結(jié)果的狀態(tài)就可以了,對(duì)于中間過程,并不需要深究。(我細(xì)細(xì)思考了一下,還是算了。=_=)
代碼其實(shí)很簡(jiǎn)單注重的是思路。
問題描述:有一個(gè)梵塔,塔內(nèi)有三個(gè)座A、B、C,A座上有諾干個(gè)盤子,盤子大小不等,大的在下,小的在上。把這些個(gè)盤子從A座移到C座,中間可以借用B座但每次只能允許移動(dòng)一個(gè)盤子,并且在移動(dòng)過程中,3個(gè)座上的盤子始終保持大盤在下,小盤在上。
簡(jiǎn)要概括一下,每次只能移動(dòng)一個(gè)盤子,小盤子不能被大盤子壓著,源座是A、目標(biāo)座是C,過渡座是B。
嗯,問題很明確,下面開始分析。
我思考的過程是,先考慮一下最簡(jiǎn)單的情況,即只有一個(gè)盤子(n=1),一個(gè)盤子很好解決,A——>C即可;當(dāng)盤子數(shù)(n)為不確定的個(gè)數(shù)的時(shí)候,這時(shí)候,我們寫一個(gè)方法,將(n-1)個(gè)盤子按規(guī)則移動(dòng)到B盤,那么A盤上剩下的必然是最大的盤子,A——>C直接移動(dòng)到C盤即可;那么現(xiàn)在B盤上有(n-1)個(gè)盤子,為了讓這n-1個(gè)盤子中的最大的那個(gè)盤子移動(dòng)到C盤,我們寫一個(gè)方法將(n-2)個(gè)盤子按規(guī)則移動(dòng)到A盤,而B座上剩下(n-1)中最大的盤子,將這個(gè)盤子移動(dòng)到C盤;此時(shí)A上面有(n-2)個(gè)盤子,我們寫一個(gè)方法將(n-3)個(gè)盤子移動(dòng)到C盤...
那么現(xiàn)在解法很明了了,后面不過是重復(fù)上訴步驟而已了,函數(shù)體沒變,只是目標(biāo)座和過渡座變化了而已。
沒有必要去深究這中間的過程,如果從一開始去深究,n個(gè)盤子,每一個(gè)盤子的軌跡的話,那么只能是越陷越深,有時(shí)候也是要換一個(gè)角度去考慮問題。
廢話不說了,直接上代碼:
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.嗯,以上。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注