梵塔

梵塔

語出:唐 白居易 《想東遊五十韻》:“梵塔形疑踴, 閶門 勢欲浮。”

簡介

也稱漢內塔漢諾塔河內塔。問題是印度的一個古老的傳說。開天闢地的神勃拉瑪在一個廟裡留下了三根金剛石的棒,第一根上面套著64個圓的金片,最大的一個在底下,其餘一個比一個小,依次疊上去,廟裡的眾僧不倦地把它們一個個地從這根棒搬到另一根棒上,規定可利用中間的一根棒作為幫助,但每次只能搬一個,而且大的不能放在小的上面。解答結果恰如上題,面對龐大的數字(移動圓片的次數)18446744073709551615,看來,眾僧們耗盡畢生精力也不可能完成金片的移動。

關於梵塔

講講什麼是梵塔問題,梵塔問題起源於中東地區的一個古老的傳說:在梵城(Hana)地下有一個僧侶的秘密組織,他們有3個大型的塔柱,左邊的塔柱上由方到小套著64個金盤。僧侶們的工作是要把這64個金盤從左邊塔柱轉移到右邊塔柱上去。但轉移過程有規定的:1、每次只能搬動一隻盤子,盤十隻能在3個塔柱上安放,不允許放在地上;2、在每個塔柱上,只允許把小盤十疊在大盤上,反之不允許。據傳說,僧侶們完成這個任務時,世界的末日就來臨了。19世紀,法國的一位數學家對該課題進行過研究,他指示,要完成這個任務,僧侶們搬動金盤的總次數:264-1=18446744073709551615(20位)假設僧侶們個個身強力壯,每天24小時不知頭疲倦地工作,而且一秒鐘移動一個金盤,那么,完成這個任務也得花5800億年。為什麼264-1是解決梵塔問題的最小步數呢?我想,是這樣的,如果我們假設只有兩個盤,有A(始塔),B(終塔),C(中間塔),那么從AB只需3次;如果有三個盤,那么先將前二個盤以C塔為目標圓柱,解放出第三個盤則需(X2+1)次,再重複兩個盤時的情況,那么只需(X2+1+X2=2X2+1)次;以此類推則:X2=2+1X3=X2+1+X2……Xn=Xn-1+1+Xn-1即Xn=2(Xn-1+1)-1=2n-1

遊戲

後來,這個傳說就演變為漢諾塔遊戲:
1.有三根桿子A,B,C。A桿上有若干碟子
2.每次移動一塊碟子,小的只能疊在大的上面
3.把所有碟子從A桿全部移到C桿上
解決算法(C語言) /* Copyrighter by SS7E */
#include /* Copyrighter by SS7E */
void hanoi(int n,char A,char B,char C) /* Copyrighter by SS7E */
{
if(n==1)
{
printf("Move disk %d from %c to %c\n",n,A,C);
}
else
{
hanoi(n-1,A,C,B); /* Copyrighter by SS7E */
printf("Move disk %d from %c to %c\n",n,A,C);
hanoi(n-1,B,A,C); /* Copyrighter by SS7E */
}
}
main() /* Copyrighter by SS7E */
{
int n;
printf("請輸入數字n以解決n階漢諾塔問題:\n");
scanf("%d",&n);
hanoi(n,'A','B','C');
}/* Copyrighter by SS7E */
如果按照最快的速度移動即不重複地移
想移動第二片金片則需要先移動第一片
想移動第三片金片則需要先移動第二片
.
.
.
想移動第64片需要先移動第63片
移動第一片需要1次
移動第二片需要3次(必須將第一片移到第二片上才能將第三片移下來)
移動第三片需要7次
移動第四片需要15次......
可以看出每想移動一片就需要將上邊的所有片摞在一起
所以每移動一片都需要操作上一片次數的二倍+1(自己那片動)
所以由數列可知移動第n片需要2^n-1次
64片就需要2的64次方減1次
2的64次方...
如圖:已知有三根針分別用1,2,3表示,在一號針中從小放n個盤子,現要求把所有的盤子
從1針全部移到3針,移動規則是:使用2針作為過度針,每次只移動一塊盤子,且每根針上
不能出現大盤壓小盤.找出移動次數最小的方案.
程式如下:
program fanta;
var
n:integer;
procedure move(n,a,b,c:integer);
begin
if n=1 then writeln(a,'--->',c)
else begin
move(n-1,a,c,b);
writeln(a,'--->',c);
move(n-1,b,a,c);
end;
end;
begin
write('Enter n=");
read(n);
move(n,1,2,3);
end.
的詳細解析(pascal)

相關詞條

相關搜尋

熱門詞條

聯絡我們