漢諾塔(hanoi) C語言實現

alexanderkenndy發表於2014-07-20

       最近一直在學習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⑴ = 1

H(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



相關文章