词条 | 梵塔 |
释义 | 简介也称汉内塔,汉诺塔,河内塔。问题是印度的一个古老的传说。开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着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<stdio.h> /* 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,A,C); } else { hanoi(n-1,A,C,B); /* Copyrighter by SS7E */ printf("Move disk %d from %c to %c\",n,A,C); hanoi(n-1,B,A,C); /* Copyrighter by SS7E */ } } main() /* Copyrighter by SS7E */ { int n; printf("请输入数字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) |
随便看 |
|
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。