1. C璇瑷瀹为獙棰樷斺旀眽璇哄
銆愪緥銆慔anoi濉旈梾棰
涓鍧楁澘涓婃湁涓夋牴阍堬纴A锛孊锛孋銆侫阍堜笂濂楁湁64涓澶у皬涓岖瓑镄勫浑鐩桡纴澶х殑鍦ㄤ笅锛屽皬镄勫湪涓娿傚傚浘5.4镓绀恒傝佹妸杩64涓鍦嗙洏浠峣阍堢Щ锷–阍堜笂锛屾疮娆″彧鑳界Щ锷ㄤ竴涓鍦嗙洏锛岀Щ锷ㄥ彲浠ュ熷姪B阍堣繘琛屻备絾鍦ㄤ换浣曟椂鍊欙纴浠讳綍阍堜笂镄勫浑鐩橀兘蹇呴’淇濇寔澶х洏鍦ㄤ笅锛屽皬鐩桦湪涓娿傛眰绉诲姩镄勬ラゃ
链棰樼畻娉曞垎鏋愬备笅锛岃続涓婃湁n涓鐩桦瓙銆
濡傛灉n=1锛屽垯灏嗗浑鐩树粠A鐩存帴绉诲姩鍒癈銆
濡傛灉n=2锛屽垯锛
1.灏咥涓婄殑n-1(绛変簬1)涓鍦嗙洏绉诲埌B涓婏绂
2.鍐嶅皢A涓婄殑涓涓鍦嗙洏绉诲埌C涓婏绂
3.链钖庡皢B涓婄殑n-1(绛変簬1)涓鍦嗙洏绉诲埌C涓娿
濡傛灉n=3锛屽垯锛
A. 灏咥涓婄殑n-1(绛変簬2锛屼护鍏朵负n`)涓鍦嗙洏绉诲埌B(鍊熷姪浜嶤)锛屾ラゅ备笅锛
(1)灏咥涓婄殑n`-1(绛変簬1)涓鍦嗙洏绉诲埌C涓娿
(2)灏咥涓婄殑涓涓鍦嗙洏绉诲埌B銆
(3)灏咰涓婄殑n`-1(绛変簬1)涓鍦嗙洏绉诲埌B銆
B. 灏咥涓婄殑涓涓鍦嗙洏绉诲埌C銆
C. 灏咮涓婄殑n-1(绛変簬2锛屼护鍏朵负n`)涓鍦嗙洏绉诲埌C(鍊熷姪A)锛屾ラゅ备笅锛
(1)灏咮涓婄殑n`-1(绛変簬1)涓鍦嗙洏绉诲埌A銆
(2)灏咮涓婄殑涓涓鐩桦瓙绉诲埌C銆
(3)灏咥涓婄殑n`-1(绛変簬1)涓鍦嗙洏绉诲埌C銆
鍒版わ纴瀹屾垚浜嗕笁涓鍦嗙洏镄勭Щ锷ㄨ繃绋嬨
浠庝笂闱㈠垎鏋愬彲浠ョ湅鍑猴纴褰搉澶т簬绛変簬2镞讹纴绉诲姩镄勮繃绋嫔彲鍒呜В涓轰笁涓姝ラわ细
绗涓姝 鎶夹涓婄殑n-1涓鍦嗙洏绉诲埌B涓婏绂
绗浜屾 鎶夹涓婄殑涓涓鍦嗙洏绉诲埌C涓婏绂
绗涓夋 鎶夿涓婄殑n-1涓鍦嗙洏绉诲埌C涓婏绂鍏朵腑绗涓姝ュ拰绗涓夋ユ槸绫诲悓镄勚
褰搉=3镞讹纴绗涓姝ュ拰绗涓夋ュ张鍒呜В涓虹被钖岀殑涓夋ワ纴鍗虫妸n`-1涓鍦嗙洏浠庝竴涓阍堢Щ鍒板彟涓涓阍堜笂锛岃繖閲岀殑n`=n-1銆 鏄剧劧杩欐槸涓涓阃掑綊杩囩▼锛屾嵁姝ょ畻娉曞彲缂栫▼濡备笅锛
move(int n,int x,int y,int z)
{
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()
{
int h;
printf("\ninput number:\n");
scanf("%d",&h);
printf("the step to moving %2d diskes:\n",h);
move(h,'a','b','c');
}
浠庣▼搴忎腑鍙浠ョ湅鍑,move鍑芥暟鏄涓涓阃掑綊鍑芥暟锛屽畠链夊洓涓褰㈠弬n,x,y,z銆俷琛ㄧず鍦嗙洏鏁帮纴x,y,z鍒嗗埆琛ㄧず涓夋牴阍堛俶ove 鍑芥暟镄勫姛鑳芥槸鎶妜涓婄殑n涓鍦嗙洏绉诲姩鍒皕涓娿傚綋n==1镞讹纴鐩存帴鎶妜涓婄殑鍦嗙洏绉昏呖z涓婏纴杈揿嚭x鈫抸銆傚俷!=1鍒椤垎涓轰笁姝ワ细阃掑綊璋幂敤move鍑芥暟锛屾妸n-1涓鍦嗙洏浠巟绉诲埌y锛涜緭鍑簒鈫抸锛涢掑綊璋幂敤move鍑芥暟锛屾妸n-1涓鍦嗙洏浠巠绉诲埌z銆傚湪阃掑綊璋幂敤杩囩▼涓璶=n-1锛屾晠n镄勫奸愭¢掑噺锛屾渶钖峦=1镞讹纴缁堟㈤掑綊锛岄愬眰杩斿洖銆傚綋n=4 镞剁▼搴忚繍琛岀殑缁撴灉涓猴细
input number:
4
the step to moving 4 diskes:
a鈫抌
a鈫抍
b鈫抍
a鈫抌
c鈫抋
c鈫抌
a鈫抌
a鈫抍
b鈫抍
b鈫抋
c鈫抋
b鈫抍
a鈫抌
a鈫抍
b鈫抍
2. 如何做一个C语言编程的汉诺塔游戏要有源代码。
#include<stdio.h>
void move(char x,char y)
{
printf("%c-->%c\n",x,y);
}
void hanoi(int n,char one ,char two,char three)
{
if(n==1) move(one,three);
else
{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
main()
{
int m;
printf("input the number of disks:");
scanf("%d",&m);
printf("the step to moving %3d diskes:\n"咐亩,m);
hanoi(m,'液简档A','B','C');
}
算法介绍:
其实算法非常简单,当盘子的个数为n时,移动的次数应等于2^n – 1(有兴趣的可以自己证明试试看)。后来一位美国学者发现一种出人意料的简单方法,只要轮流进行两步操作就可以了。首先把三根柱子按顺序排成品字型,把所有的圆盘按从大到小的顺序放在柱子A上,根据圆盘的数量确定柱子的排放顺序:若n为偶数,按顺时针方向依次摆放 A B C;
若n为奇数,按顺时针方向依次摆放 A C B。
(1)按顺时针方向把圆盘1从现在的柱子移动到下一根柱子,即当n为偶数时,若圆盘1在柱子A,则把它移动到B;若圆盘1在柱子B,则把它移动到C;若圆盘1在柱子C,则把它移动到A。
(2)闹乱接着,把另外两根柱子上可以移动的圆盘移动到新的柱子上。即把非空柱子上的圆盘移动到空柱子上,当两根柱子都非空时,移动较小的圆盘。这一步没有明确规定移动哪个圆盘,你可能以为会有多种可能性,其实不然,可实施的行动是唯一的。
(3)反复进行(1)(2)操作,最后就能按规定完成汉诺塔的移动。
所以结果非常简单,就是按照移动规则向一个方向移动金片:
如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C
汉诺塔问题也是程序设计中的经典递归问题,下面我们将给出递归和非递归的不同实现源代码。
3. C璇瑷姹夎哄旓纸楂桦垎鎻愰梾锛
hanio(n-1,a,c,b);锛堟彁闂锛氢负浠涔埚弬鏁拌剧疆涓篴,c,b锛
move(a,c);
hanio(n-1,b,a,c); (鎻愰梾锛氲岃繖涓鍙堣剧疆鎴愪负b,a,c)
鍏跺疄濡傛灉娓呮氢简绉诲姩瑙勫垯,杩欎釜灏卞緢绠鍗曚简.
鍒嗘瀽链変袱涓鐩桦瓙镄勬儏鍐,鏄剧劧涓:
a-b
a-c
b-c
锅囱炬湁n涓鐩桦瓙,鎴戜滑涔熷彲浠ョ湅浣滀袱涓鐩桦瓙,鍏朵腑链涓婇溃镄勪竴涓涓簒,涓嬮溃镄刵-1涓涓簓,闾d箞杩欎袱涓鐩桦瓙镄勪互钖庡氨鍜屼笂闱涓镙
x:a-b
y:a-c
x:b-c
钥岄偅n-1涓鐩桦瓙涔熷彲浠ョ敤钖屾牱鏂规硶澶勭悊.杩欐牱鎴戜滑镀忔湁浜嗕竴涓鍏寮:
if(n==1)
鐩存帴灏嗕竴涓鐩桦瓙浠巃绉诲姩鍒瘫;
else
{
鍏埚皢n-1涓鐩桦瓙浠巃绉诲姩鍒痈;
鎶婄琻涓鐩桦瓙浠巃绉诲姩鍒瘫;
灏唍-1涓鐩桦瓙浠巄绉诲姩鍒瘫;
}
杩欐牱灏卞畬鎴愪简绉诲姩,濡傛灉鏄庣槠浜呜繖涓,闾d箞鍓嶉溃镄勫氨濂芥哕浜,
hanio(n-1,a,c,b); //锲犱负hanio鍑芥暟瀹为檯绉诲姩镄勬槸char a,char c,涔熷氨鏄绗浜屽拰绗锲涗釜鍙傛暟,镓浠ヨ繖鍎垮彲浠ョ湅鎴愭妸n-1涓鐩桦瓙浠巃绉诲姩鍒痈;
move(a,c);
hanio(n-1,b,a,c); //杩椤効鍙浠ョ湅鎴愭妸n-1涓鐩桦瓙浠巃绉诲姩鍒痈;
4. C语言汉诺塔问题,请问这个n=3的详细步骤是什么呀,大一新生没听懂
这是汉诺塔的算法的问题。程序本身很简单。
汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
这个主要是看算法,再一个就是递归的学习,程序本身非常简单。