汉诺塔问题来自
的有关信息介绍如下:问题补充说明:我要它的基本思路,C语言源程序,还要它的算法,流程图,以及调试过程当中出现的问题及相应解决办法!我知道要求多了点,不过,我尽可能的把我的分数全给了啊!拜托各位啦……要快啊………………
汉诺塔(又称河内塔)问题是360问答印度的一个古老的包督露停实轮易依富传说。开天辟地的神勃拉玛在一个庙里留脸许厚字住己美目免盟下了三根金刚石的棒,第一送径根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一苏谁苗树群顶五航夜歌个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。解答结果请自己运行计景件呀艺法印执矿界件算,程序见尾部。面对庞大的数字(移动圆片的次数)18446744073709551615,看来,众僧们耗尽毕生精力也不可能完成金片的移动。道罗粒铁承燃 后来,这个传说就演变为汉诺塔游戏: 1.有三根杆子A,B,境附值敌犯还达欢帝C。A杆上有若干碟子 2.每次移动一块碟子,小的只能叠在大的上面 3.把化善所有碟子从A杆全部移到C杆上 经过研究发现,汉诺塔的破解很简单,就是按照移动规图则向一个方向移动金即刘去洲角斯化足片: 如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C 此外,汉诺塔问题也是程序设计中的经典递归问题。 算法思路: 1.如果只有一个金片,则把该金片从源移动到目标棒,结束。 2.如果有n个金片,则把前n-1个金片移动到娘铁城屋辅助的棒,然后把自己移动到目标棒,最后再把前n-1个移动到目标棒 (非专业人士可以忽略以下内容) 补系继封充:汉诺塔的算法实现(c++) #include<fstream> #incl味管员千值夜鸡相初ude<iostream> usingnamespacestd; ofstreamfout("out.txt"); voidMove(intn,charx,chary) { fout<<"把"<<n<<"号从"<<x<<"挪动到座者汉强表但补"<<y<<endl; } voidHannoi(intn,chara,charb,除打处治些陆超丝charc) { if(n==1) Move(1,a,c); else { Hannoi(n-1,a,c,b); Move(n,a,c); Hannoi(n-1,b,a,c); } } intmain() { fout<<"以下是7层汉诺塔的解法:"<<endl; Hannoi(7,'a','b','c'); fout.close(); c执二料微秋井本太out<<"输出完毕!"<<endl; return0; } C语言精简算法 /*CopyrighterbySS7E*/ 星 #include<s识川tdio.h>/*CopyrighterbySS7E*/ voidhanoi(intn,charA,charB,charC)/*CopyrighterbySS7E*/ { if(n==1) { printf("Movedisk%dfrom%cto%c\n",n,A,C); } else { hanoi(n-1,A,C,B);/*CopyrighterbySS7E*/ printf("Movedisk%dfrom%cto%c\n",n,A,C); hanoi(n-1,B,A,C);/*CopyrighterbySS7E*/ } } main()/*CopyrighterbySS7E*/ { intn; printf("请输入数字n以解决n阶汉诺塔问题:\n"); scanf("%d",&n); hanoi(n,'A','B','C'); }/*CopyrighterbySS7E*/ PHP算法: <?php functionhanoi($n,$x,$y,$z){ if($n==1){ move($x,1,$z); }else{ hanoi($n-1,$x,$z,$y); move($x,$n,$z); hanoi($n-1,$y,$x,$z); } } functionmove($x,$n,$z){ echo'movedisk'.$n.'from'.$x.'to'.$z.'<br>'; } hanoi(10,'x','y','z'); ?> JAVA算法: publicclassHaniojava { publicstaticvoidmain(Stringargs[]) { byten=2; chara='A',b='B',c='C'; hanio(n,a,b,c); } publicstaticvoidhanio(byten,chara,charb,charc) { if(n==1) System.out.println("move"+a+"to"+b); else { hanio((byte)(n-1),a,c,b); System.out.println("move"+a+"to"+b); hanio((byte)(n-1),c,b,a); } } } #include<iostream.h> voidmove(charch1,charch2){ cout<<ch1<<"->"<<ch2<<''; } voidhanoi(intn,chara,charb,charc){ if(n==1) move(a,c); else{ hanoi(n-1,a,c,b); move(a,c); hanoi(n-1,b,a,c); } } voidmain(){ intm; cout<<"Enterthenumberofdisktomove:\n"; cin>>m; cout<<"Thesteptomoving"<<m<<"disk:\n"; hanoi(m,'A','B','C'); cin>>m; } 用不了这么复杂 ,设A上有n个盘子。 如果n=1,则将圆盘从A直接移动到C。 如果n=2,则: 1.将A上的n-1(等于1)个圆盘移到B上; 2.再将A上的一个圆盘移到C上; 3.最后将B上的n-1(等于1)个圆盘移到C上。 如果n=3,则: A.将A上的n-1(等于2,令其为n`)个圆盘移到B(借助于C),步骤如下: (1)将A上的n`-1(等于1)个圆盘移到C上。 (2)将A上的一个圆盘移到B。 (3)将C上的n`-1(等于1)个圆盘移到B。 B.将A上的一个圆盘移到C。 C.将B上的n-1(等于2,令其为n`)个圆盘移到C(借助A),步骤如下: (1)将B上的n`-1(等于1)个圆盘移到A。 (2)将B上的一个盘子移到C。 (3)将A上的n`-1(等于1)个圆盘移到C。 到此,完成了三个圆盘的移动过程。 从上面分析可以看出,当n大于等于2时,移动的过程可分解为三个步骤: 第一步把A上的n-1个圆盘移到B上; 第二步把A上的一个圆盘移到C上; 第三步把B上的n-1个圆盘移到C上;其中第一步和第三步是类同的。 当n=3时,第一步和第三步又分解为类同的三步,即把n`-1个圆盘从一个针移到另一个针上,这里的n`=n-1。显然这是一个递归过程,据此算法可编程如下: move(intn,intx,inty,intz) { if(n==1) printf("%c-->%c\n",x,z); else { move(n-1,x,z,y); printf("%c-->%c\n",x,z); move(n-1,y,x,z); } } main() { inth; printf("\ninputnumber:\n"); scanf("%d",&h); printf("thesteptomoving%2ddiskes:\n",h); move(h,'a','b','c'); }