筆者以前在大學裡面學習演算法的時候一直沒有把漢諾塔這個遊戲給整明白,直到在工作被人問起,然後一臉的尷尬說我不知道才意識到我以前的大學都白讀了,甚是慚愧啊,研究一會兒之後,做個筆記,算是給自己的大學演算法老師做個交代吧
漢諾塔遊戲簡介:
有三根柱子,假設為x, y ,z三根柱子,現在x柱子上放置了諾幹個圓盤,按照小的在上,大的在下的順序排放,現在需要將x柱子上的圓盤通過y柱子去全部移動到z柱子上,要求是,z柱子上的圓盤依舊是小的在上,大的在下的順序,並且必須要保證所有的柱子上的圓盤都是小的在大的上面,而且每次只能移動乙個圓盤
演算法詳解:
在講解遞迴演算法的時候,漢諾塔往往就是最經典的例子之一,那如何思考呢,首先,如果只有乙個圓盤,只需要直接將圓盤從x移動到z上面即可,如果圓盤數不止乙個,那如何思考呢,其實這裡面的步驟只需要三步:
1:將x柱子上的n-1個圓盤通過柱子z移動到y柱子上;
2:將x柱子上的第n個圓盤移動到z柱子上;
3:將y柱子上的n-1個圓盤通過x柱子移動到z上,至此,就完成了全部的移動
那疑問來了,不是說一次只能移動乙個嗎,我前面講的一次移動了n-1個柱子,是的 ,其實這裡就用了遞迴,那這n-1個柱子如何通過z移動到y上呢,其實這就是剛開始問題了,重複呼叫自己就行了,
接下來貼演算法:
public static void hanio(int n,string x,string y,string z)else
}
怎麼樣,是不是很簡單,只需要簡簡單單的幾行**就可以了,感覺真對不起的大學時的演算法老師啊,老師我錯了, 漢諾塔遊戲
漢諾塔 於印度傳說的乙個故事,上帝創造世界時作了三根金剛石柱子,在一根柱子上從下往上按大小順序摞著64片 圓盤。上帝命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一回只能移動乙個圓盤。要想玩轉漢諾塔,需要先理解遞迴。如果乙個問題可以不斷地...
漢諾塔遊戲
題目描述 在a b c三根柱子上,有n個不同大小的圓盤 設半徑分別為1 n 一開始他們都疊在a上,你的目標是在最少的合法移動步數內將所有盤子從a塔移動到c塔。遊戲中的每一步規則如下 1 每一步只允許移動乙個盤子 從一根柱子最上方到另乙個柱子的最上方 2 移動的過程中,你必須保證大的盤子不能在小的盤子...
Unity實現漢諾塔遊戲
漢諾塔的規則 有abc三個柱子,a柱子上從小到大排列圓盤 要將a柱子上所有圓盤移動到c柱子上,每次只能移乙個 圓盤放置必須從小到大,不能存在此盤子上面有比它大的存在。比如三個漢諾塔玩法 理理思路,大體演算法就是這個樣 那麼演算法就很清晰了。不知道哪一天我又想把這個遊戲擴充套件,我決定用四個類,讓遊戲...