漢諾塔問題

        漢諾塔問題是一個簡單又經典的遞歸問題。

  題目描述

        漢諾塔(Hanoi Tower),又稱河內塔,源於印度一個古老傳說。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞着64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,任何時候,在小圓盤上都不能放大圓盤,且在三根柱子之間一次只能移動一個圓盤。問應該如何操作?

  漢諾塔問題的解決思路及算法

       假設3根柱子分別爲A、B、C,圓盤數目爲n.

               1. n=1 , 如果A有一個圓盤,則直接移動至C。

               2. n=2, 如果A有2個圓盤,則A->B, A->C , B->C。

       假設當我們在數目爲n-1的時候已經解決了移動問題可以成功移動至C,如果又多一個呢,即n,我們用同樣的方法把圓盤移動至B(我們已經可以把n-1個盤子通過B移動至C了,那麼通過移動至B也一樣),爲什麼移動至B了呢,因爲多了個盤子(放在最底部的大盤子),我們要向步驟2一樣把上面的n-1個盤子看成一個整體,用上一個方法即移動n-1個盤子的方法把上面的n-1個盤子移動至B,然後把新增的那個大盤子移動至 C ,然後再用移動n-1個盤子對應的方法把B中的n-1個盤子移動至C,就完成了。

      假設n = n 時,

       步驟1: 將n-1個盤子從A移動到B(藉助C),A上剩餘一個盤子。

       步驟2: 將A上的一個盤子,移動到C,在將B上的盤子移動到C,及完成有A到C盤子的移動。

  算法實現:

void hanoi(char A, char B, char C , int n) //藉助B柱子,將A上的盤子移動到C
{
	if(n == 1)
	{
		cout<<A<<"->"<<C<<endl; //如果只有一個盤子不需要藉助任何柱子,即可以進行移動
	}
	else
	{
		hanoi(A,C,B,n-1); //如果不至一個盤子,則調用移動n-1個盤子,藉助C,從A移到B
		cout<<A<<"->"<<C<<endl; //將A中剩餘的一個盤子移動到C
		hanoi(B,A,C,n-1); //將B上的n-1個盤子,藉助A,移動到C
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章