將以下內(nèi)容全部復制到新建的源文件中:(本人自己寫的,因為你那課本上的代碼,沒解釋,書寫不規(guī)范,很難理解清楚,所以我直接新寫了一個完整的代碼,附帶詳細說明)
成都創(chuàng)新互聯(lián)主營唐縣網(wǎng)站建設的網(wǎng)絡公司,主營網(wǎng)站建設方案,成都app開發(fā),唐縣h5微信小程序開發(fā)搭建,唐縣網(wǎng)站營銷推廣歡迎唐縣等地區(qū)企業(yè)咨詢
#include stdio.h
//漢諾塔x層塔從A塔整體搬到C塔,中間臨時B塔。
//x層塔是從大到小往上疊放。每次移動只能移動一層塔。并且在移動過程中必須保證小層在上邊
//借助B塔可以將x層塔全部從A搬到C上,并且符合要求(在移動過程中大的那塊在下邊,小的那塊在上邊)
int main()
{
void tower(int x,char a,char b,char c); //聲明函數(shù)
int x=5,a='A',b='B',c='C'; //x表示有5層塔,具體要多少層自己修改這個值。abc分別表示ABC塔。
tower(x,a,b,c); //x層塔從a移動到c的全過程,主程序只有這條有效語句
return 0;
}
//以下是tower函數(shù)的定義
//參數(shù)解析:x層塔放在a上,b是中間塔,c是目標塔。即x層塔要從a搬到c上。
//此函數(shù)實現(xiàn)x層塔從a整體轉(zhuǎn)移到c上。以及這個過程是怎么搬的全部過程。
void tower(int x,char a,char b,char c)
{
if(x==1)printf("將%d從%c放到%c\n",x,a,c); //只有1層塔時,直接從a搬到c上。
else //不止1層塔,則先將x-1層塔從a按照規(guī)律搬到b上,再將最后一塊從a搬到c上,最后再將b上的x-1層塔按照規(guī)律搬到c上。
{
tower(x-1,a,c,b); //先將x-1層塔從a按照規(guī)律搬到b上,注意參數(shù)b放在最后,因為放在最后的參數(shù)是準備搬過去的目標塔。
printf("將%d從%c放到%c\n",x,a,c); //將最后一塊從a搬到c上
tower(x-1,b,a,c); //最后再將b上的x-1層塔按照規(guī)律搬到c上,注意參數(shù)b放在開頭,因為x-1層是要從b上搬過去的。
}
}
解決漢諾塔的基本思想是先把n個盤子除了最下面的盤子以外的所有盤子從第一根柱子(初始柱子)移動到中間那個柱子上(輔助柱子),然后把最下面的盤子移動到最后一根柱子上(目標柱子)。最后把剩下的盤子移動到目標柱子上。這樣,然而,完成第一步和第三步也同樣是一個移動n-1個盤子的漢諾塔問題。于是,遞歸調(diào)用在這里不可避免。程序你已經(jīng)寫的很清楚,給你解釋一下?,F(xiàn)把你的程序畫上行以便說明。
1 #include "stdio.h"
2 main()
3 {void hanoi(int,char,char,char); br/4 int m; br/5 printf("input the number of disks:"); br/6 scanf("%d",m); br/7 printf("The step to moving %d disks:\n",m); br/8 hanoi(m,'A','B','C'); br/9 }
10 void hanoi(int n,char a,char b,char c)
11 {//void move(char,char);
12 if(n==1) move(a,c);
13 else
14 {hanoi(n-1,a,c,b); br/15 move(a,c); br/16 hanoi(n-1,b,a,c); br/17 }
18 }
19 void move(char x,char y)
20 {printf("%c--%c\n",x,y); br/21 }
當m=4時,程序走到第8行,調(diào)用函數(shù)hanoi(int n,char a,char b,char c)。此時,實參把值傳遞給了形參,于是此時,n=4,a=A,b=B,c=C。我把第11行的void move(char,char); 注釋掉了,應該知道這一句的意思。因為這一行雖然可以讓程序更加完整,但是解釋的時候加上它會很麻煩。程序走到第12行,因為此時n=4,而不等于1,程序直接走第13行。于是調(diào)用第14行的hanoi(n-1,a,c,b)。這是一個遞歸調(diào)用。此時,n=3,a=A,c=B,b=C。要清楚,A,B,C代表的意義。A代表初始柱子,B代表輔助柱子,C代表目標柱子。而a代表第一根柱子,b代表第二根柱子,c代表第三根柱子。這是不一樣的。程序繼續(xù)走,到12行時n依然不等于1。走到14行調(diào)用hanoi(n-1,a,c,b)。此時,n=2,a=A,c=C,b=B。程序再走,到12行時n依然不等于1,走到14行調(diào)用hanoi(n-1,a,c,b)。此時,n=1,a=A,c=B,b=C。程序走到12行時發(fā)現(xiàn)n=1,程序開始走15行。調(diào)用move(char x,char y)到20行時輸出A--B。調(diào)用結(jié)束,回到上一個調(diào)用即n=2,a=A,c=C,b=B。程序回到第15行,輸出 A--B。再走第16行,調(diào)用hanoi(n-1,b,a,c)。此時n=1,b=A,a=B,c=C。程序回到12行再調(diào)用19行輸出B--C。調(diào)用結(jié)束,回到上一個調(diào)用n=3,a=A,c=B,b=C。程序走到15行,輸出A--C,這時,第一根柱子上有一個盤子,第二根柱子上有一個盤子,第三根柱子上有兩個盤子。再調(diào)用16行就可以完成把第三根柱子里的所有盤子都移動到第二根柱子上。這樣。我們就完成了整體目標的第一步。把n個盤子除了最下面的盤子以外的所有盤子從第一根柱子(初始柱子)移動到中間那個柱子上(輔助柱子),調(diào)用完成后程序回到15行,此時n=3,a=A,c=B,b=C。15行時輸出A--C,這時便完成了整體目標的第二步,最下面的盤子移動到最后一根柱子上(目標柱子)。再根據(jù)程序走到16行,經(jīng)過跟14行類似的一系列的遞歸調(diào)用,我們就可以完成最終目標了。
#include graphics.h
struct H
{
int data[15];/*存放每個盤的代號*/
int top;/*每個塔的具體高度*/
}num[3];/*三個塔*/
void move(char x,char y,struct H num[3]);/*移動的具體過程*/
void hanoi(char x,char y,char z,int n,struct H num[3]);/*遞歸*/
void Init(void);/*初始化*/
void Close(void);/*圖形關閉*/
int computer=1;/*自動控制與手動控制的標志*/
int speed=0;/*全局變量speed主要是演示過程的速度*/
void main(void)
{
Init();/*初始狀態(tài)*/
Close();/*圖形關閉*/
exit(0);
}
void Init(void)/*初始化*/
{
int gd=DETECT,gm;
int i,n,color;
clrscr();
printf("please input n(n=10): ");/*輸入要演示的盤子數(shù)*/
scanf("%d",n);
printf("Please input 1 or 2:\n1點抗 puter 2.people\n");
scanf("%d",i);
if(i==2)/*選擇手動控制標志為0*/
computer=0;
if(n1||n10)
n=10;/*越界的話n當10處理*/
if(computer)/*如果是自動控制的話輸入速度*/
{
printf("please input speed: ");/*輸入速度*/
scanf("%d",speed);
}
initgraph(gd,gm,"c:\\tc");
cleardevice();
for(i=0;i3;i++)
num[i].top=-1;/*三個地方的高度開始都為-1*/
for(i=0;in;i++)/*畫一開始的塔座A上的盤子*/
{
num[0].top++;/*棧的高度加1*/
num[0].data[num[0].top]=i; /*最大的盤子代號為0,依次為1,2,…n-1*/
color=num[0].data[num[0].top]+1;/*盤子的顏色代碼為棧頂盤子代號加1*/
setfillstyle(SOLID_FILL,color);
bar(100-(33-3*num[0].data[num[0].top]),400-20*i-8,100+
(33-3*num[0].data[num[0].top]),400-20*i+8); /*畫矩形*/
}
setcolor(YELLOW);
outtextxy(180,450,"any key to continue");
settextstyle(0,0,2);
outtextxy(90,420,"A"); /*塔座標志*/
outtextxy(240,420,"B");
outtextxy(390,420,"C");
getch();/*接收字符后就執(zhí)行遞歸操作*/
hanoi('a','b','c',n,num);
}
void move(char x,char y,struct H num[3])/*移動的具體過程*/
{
int i;
char num1[3],num2[3];
sprintf(num1,"%c",x-32);/*將小寫變成大寫,并轉(zhuǎn)換成字符串輸出*/
sprintf(num2,"%c",y-32);
setfillstyle(SOLID_FILL,BLACK);/*把原來的地方移去涂黑*/
bar(0,0,640,60);
setcolor(RED);
outtextxy(150,30,num1);/*輸出移動過程*/
outtextxy(200,30,"---");
outtextxy(310,30,num2);
settextstyle(0,0,2);
setfillstyle(SOLID_FILL,BLACK);/*把原來的地方移去涂黑*/
bar(100+150*(x-97)-(33-3*num[x-97].data[num[x-97].top]),
400-20*num[x-97].top-8,100+150*(x-97)+(33-3*
num[x-97].data[num[x-97].top]),400-20*num[x-97].top+8);
num[y-97].top++;/*入棧,目標點的top加1*/
num[y-97].data[num[y-97].top]=num[x-97].data[num[x-97].top];/*在目標點盤子的代號與源點盤子的代號相同*/
num[x-97].top--;/*出棧,原來地方的top減1*/
setfillstyle(SOLID_FILL,num[y-97].data[num[y-97].top]+1);/*盤子顏色代碼是棧頂盤子代號加1*/
bar(100+150*(y-97)-(33-3*num[y-97].data[num[y-97].top]),
400-20*num[y-97].top-8,100+150*(y-97)+
(33-3*num[y-97].data[num[y-97].top]),400-20*num[y-97].top+8);
if(computer)/*自動控制就用delay*/
delay(speed);/*延時函數(shù)*/
else
getch();/*手動控制的話就自己按鍵盤來控制*/
}
void hanoi(char one,char two,char three,int n,struct H num[3])/*遞歸n為盤子數(shù),num為堆棧*/
{
if(n==1)
move(one,three,num);/*如果盤子為1,將這個盤子從塔座A移動到塔座C*/
else
{
hanoi(one,three,two,n-1,num);/*將塔座A的前n-1個盤子移到塔座B*/
move(one,three,num);/*將塔座A的第n個盤子移到塔座C*/
hanoi(two,one,three,n-1,num); /*將塔座B的n-1個盤子移到塔座C*/
}
}
void Close(void)/*圖形關閉*/
{
getch();
closegraph();
}
當前名稱:漢諾塔c語言函數(shù)圖 漢諾塔c語言程序代碼
鏈接地址:http://muchs.cn/article10/ddihdgo.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供微信小程序、網(wǎng)站策劃、品牌網(wǎng)站建設、虛擬主機、品牌網(wǎng)站制作、網(wǎng)站排名
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)