Hanio 問題

 Hanio 問題

   問題描述

   廟裏的和尚,閒得無聊,廟中有三個柱子,分別標記爲柱子A,柱子B,柱子C.

   柱子A有三個盤子,這三個盤子呢,直徑最大的放在最下面,第二大的放中間,最小的放最上面。

   柱子B是空的。

   柱子C也是空的。

   如果A柱子上的盤子能借助B 搬到C柱子上,並切盤子順序是跟原先A上一致。做這個過程和尚感覺是非常有意思的。沒辦法,吃飽了撐的。

   當然這裏面有兩個規則

  1 第次只能搬一個

   2 不能將大直徑的放到小直徑上面

  分析問題

   假設A上面有N個盤子,如果我呢把N-1個盤子已經搬到了B上面,我只需要將A盤子放到這個C上面,第N個盤子的直徑是最大的,再以後的搬動過程中是不需要動C上第N個盤子的。以上搬動N個盤子的問題,就變爲搬N-1個盤子的問題。如此規則執行下去,只後只有一個圓盤的時候,問題直接解決了。

  這種方式適合遞歸算法

     1 有遞歸出口,那就是當盤子只有一個時候,問題很簡單,直接解決

      2 有策略能使問題規模縮小,並且問題是相似,

        a 將N-1個盤子從A 搬到B柱上面,(藉助C)

        b 將A柱子上第N個盤子搬到C柱上面

        c 將B柱子上N-1個盤子搬到C柱子上面 (藉助A)

   OK 那java實現爲

  

  

	public void hanioAlgorithms(int n,String A,String B,String C){
		if (n==1 )
		{
			  move(1,A,C);
			  return;
		}
		hanioAlgorithms(n-1,A,C,B);
		this.move(n, A, C);
		hanioAlgorithms(n-1, B, A, C);
		
		
		
	}
	private void move(int n ,String A,String C){
		System.out.println("將第"+n+"個盤子 從"+A+"移動到"+C);
	}

}

 

点赞