漢諾塔(hanoi) C語言實現
最近一直在學習C語言,學習了遞迴,準備寫個程式練個手,就找到了漢諾塔,權當入門吧,日後在寫一個走迷宮的,都算是入門比較經典的演算法了。
神話傳說:
法國數學家愛德華·盧卡斯曾編寫過一個印度的古老傳說:在世界中心貝拿勒斯(在印度北部)的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有一個僧侶在按照下面的法則移動這些金片:一次只移動一片,不管在哪根針上,小片必須在大片上面。僧侶們預言,當所有的金片都從梵天穿好的那根針上移到另外一根針上時,世界就將在一聲霹靂中消滅,而梵塔、廟宇和眾生也都將同歸於盡。
不管這個傳說的可信度有多大,如果考慮一下把64片金片,由一根針上移到另一根針上,並且始終保持上小下大的順序。這需要多少次移動呢?這裡需要遞迴的方法。假設有n片,移動次數是f(n).顯然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此後不難證明f(n)=2^n-1。n=64時,
假如每秒鐘一次,共需多長時間呢?一個平年365天有31536000 秒,閏年366天有31622400秒,平均每年31556952秒,計算一下:
18446744073709551615秒
這表明移完這些金片需要5845.54億年以上,而地球存在至今不過45億年,太陽系的預期壽命據說也就是數百億年。真的過了5845.54億年,不說太陽系和銀河系,至少地球上的一切生命,連同梵塔、廟宇等,都早已經灰飛煙滅。
有預言說,這件事完成時宇宙會在一瞬間閃電式毀滅。也有人相信婆羅門至今還在一刻不停地搬動著圓盤。放心吧,在我們有生之年肯定移動不完的,嘿嘿
現抽取題目如下:
有三根相鄰的柱子,標號為A,B,C,A柱子上從下到上按金字塔狀疊放著n個不同大小的圓盤,要把所有盤子一個一個移動到柱子B上,並且每次移動同一根柱子上都不能出現大盤子在小盤子上方,請問至少需要多少次移動,設移動次數為H(n)。
首先我們肯定是把上面n-1個盤子移動到柱子C上,然後把最大的一塊放在B上,最後把C上的所有盤子移動到B上,由此我們得出表示式:
H⑴ = 1H(n) = 2*H(n-1)+1 (n>1)那麼我們很快就能得到H(n)的一般式:H(n) = 2^n - 1 (n>0)
並且這種方法的確是最少次數的,證明非常簡單,可以嘗試從2個盤子的移動開始證,你可以試試。
實現:
#include<stdio.h>
void adjust(int, char, char, char);
int main(void)
{
char A = 'A'; /* define three tower */
char B = 'B';
char C = 'C';
int n = 10;
adjust(n,A,B,C);
return 0;
}
void adjust(int n, char A, char B, char C)
{
if (n ==1){
printf("put %d from %c to %c \n",n,A,C);
} else {
adjust(n-1,A,C,B);
printf("put %d from %c to %c\n",n,A,C);
adjust(n-1,B,A,C);
}
}
神話部分摘自 http://baike.baidu.com/view/191666.htm?fr=aladdin
相關文章
- hanoi漢諾塔C++實現C++
- 百練OJ:4147:漢諾塔問題(Hanoi)——python實現漢諾塔Python
- 小知識系列(3):Hanoi塔(漢諾塔,河內塔)
- 漢諾塔的實現
- c++遞迴與迭代實現漢諾塔C++遞迴
- PHP實現漢諾塔演算法PHP演算法
- Python實現:漢諾塔問題Python
- 遞迴實現漢諾塔問題遞迴
- HT for Web 3D遊戲設計設計--漢諾塔(Towers of Hanoi)Web3D遊戲設計
- SQL 漢諾塔SQL
- 漢諾塔詳解
- 漢諾塔-PythonPython
- ACM 漢諾塔(三)ACM
- c語言金字塔問題C語言
- 漢諾塔通項公式公式
- C#中漢諾塔問題的遞迴解法C#遞迴
- 掃雷--C語言實現C語言
- C語言實現DES加密C語言加密
- c語言實現階乘C語言
- 漢諾塔遊戲《演算法很美》遊戲演算法
- 漢諾塔演算法演示1.0演算法
- C語言實現TCP通訊C語言TCP
- 高精度加法(C語言實現)C語言
- c語言實現this指標效果C語言指標
- C語言實現順序表C語言
- C語言實現連結串列C語言
- RTree原始碼——C語言實現原始碼C語言
- C語言實現出入棧操作C語言
- 利用棧實現佇列(C語言實現)佇列C語言
- 經典遞迴解決漢諾塔!遞迴
- 漢諾塔非遞迴演算法遞迴演算法
- 漢諾塔非遞迴棧程式碼遞迴
- C語言入門:正,反兩座金字塔C語言
- C語言實現推箱子游戲C語言
- C語言__LINE__實現原理C語言
- 排序演算法-C語言實現排序演算法C語言
- C語言實現桌面貪吃蛇C語言
- 高精度減法(C語言實現)C語言