漢諾塔c語言函數(shù)圖 漢諾塔c語言程序代碼

C語言漢諾塔程序

將以下內(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上搬過去的。

}

}

求C漢諾塔遞歸過程詳解

解決漢諾塔的基本思想是先把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)用,我們就可以完成最終目標了。

怎樣用c語言圖形演示漢諾塔

#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)

小程序開發(fā)