歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Hanoi問題Java解法

Hanoi問題Java解法

日期:2017/3/1 9:21:16   编辑:Linux編程

  用什麼語言解法都差不多,思路都是一樣,遞歸,這其中只要注重於開始和結果的狀態就可以了,對於中間過程,並不需要深究。(我細細思考了一下,還是算了。=_=)

  代碼其實很簡單注重的是思路。

  問題描述:有一個梵塔,塔內有三個座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);

}

}

}

嗯,以上。

Copyright © Linux教程網 All Rights Reserved