漢諾塔(又稱河內塔)問題是源於印度乙個古老傳說的益智玩具。
大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片**圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上(可以借助第三根柱子做緩衝)。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動乙個圓盤。
如圖【1.jpg】是現代「山寨」版的該玩具。64個圓盤太多了,所以減為7個,金剛石和**都以木頭代替了......但道理是相同的。
據說完成大梵天的命令需要太多的移動次數,以至被認為完成之時就是世界末日!
你的任務是精確計算出到底需要移動多少次。
很明顯,如果只有2個圓盤,需要移動3次。
圓盤數為3,則需要移動7次。
那麼64個呢?
答案寫在「解答.txt」中,不要寫在這裡!
圖1
找了很多解釋,下面的是我覺得最好的一種,茅塞頓開
漢諾塔這個問題,在考慮它遞迴的時候,別想著我們真實移動的步驟,我當時也總是覺得很亂。你要這樣考慮:
1, 2, 3
最初都在1上,最後要移動到3上。所以把除了最後一塊都移動到2上,最後一塊移動到3上,再把2的都移動到3上。這個過程就結束了。
那怎麼把東西都移動到2上呢,你假設,2在3的位置,1還是1, 3在2的位置,這樣順序變成了:
1, 3, 2。
問題就變成了如何把1上的都移動到2上,道理還是一樣,就是,把除了最後一塊的所有塊都移動到3上,把最後一塊移動到2上,再把3上面的所有塊移動到2上。
這樣就能抽象出乙個過程:
1.移動多塊到2的位置上. //hanoi(n-1,one,three,two);n-1塊,從1到2,只看第2個和第4個引數,one,two就是從1到2.
2.移動一塊到到3的位置上. //move(one,three);
3.移動在2的位置上的多塊到3的位置上. //hanoi(n-1,two,one,three);n-1塊,從2到3,只看第2個和第4個引數,two,three就是從2到3.
遞迴都有乙個最終結束的條件,這裡就是n=1的時候,也就是只有乙個漢諾塔塊的時候,只有乙個的時候,肯定是從1直接移動到3了。
抽象成函式,就是
void hanoi(int n,char one ,char two,char three)
}void move(char x,char y)
計算順序:
#include using namespace std;
/***漢諾塔問題: 將 a 上所有的盤子,移動到 c 上 ,a b c
*/void moveac(char a,char c)
void hanoi ( int n, char sour, char temp, char dest )
else
}int main ( int argc, char **argv )
漢諾塔問題
問題 假設有3個分別命名為x,y,z的寶塔,在塔座x上插有n個直徑大小各不相同,從小到大編號為1,2,3。n的圓盤。現要求將x軸上的n個圓盤移至塔座z上 並仍然按同樣的順序疊排,圓盤移動時必須遵循下列規則 1.每次只能移動乙個圓盤 2.圓盤可以插在x,y和z中的任一塔座上 3.任何時刻都不能將乙個較...
漢諾塔問題
問題是 印度的乙個古老的傳說。開天闢地的神勃拉瑪在乙個廟裡留下了三根金剛石的棒,第一根上面套著64個圓的金片,最大的乙個在底下,其餘乙個比乙個小,依次疊上去,廟裡的眾僧不倦地把它們乙個個地從這根棒搬到另一根棒上,規定可利用中間的一根棒作為幫助,但每次只能搬乙個,而且大的不能放在小的上面。解答結果請自...
漢諾塔問題
漢諾塔如下圖所示 需要我們完成的事情是把盤子移動到c,規則就不贅述了。演算法思想 總體來說是利用遞迴完成的。假設 1 a上只有乙個盤子,我們直接移動到c即可 2 a上有兩個盤子,我們把第二個盤子上面的所有盤子 此時只有乙個,比較容易 移動到b,再把第二個盤子移動到目的地c,最後把b上的盤子移動到c ...