當前位置:首頁 » 編程軟體 » 漢諾塔的編譯怎麼寫

漢諾塔的編譯怎麼寫

發布時間: 2023-01-20 11:19:33

❶ 漢諾塔c語言怎麼解釋 不懂每步具體說明

漢諾塔的一個經典案例就是用遞歸法解決問題
A、B、C三根柱子上放盤子
開始盤子都在A上
盤子必須按照小上打下的順序放置
要求每次只能移動一個盤子
要將A上的盤子都移到B上。
分析:
設有n個盤子在A上,當n=1時
只要將盤子從A->B
即可
當n>1時此問題可分解為以下步驟
1>
把n-1個盤子從柱子A移到C
2>
把第n個盤子從A移到B
3>
把n-1個盤子從C移到B
這是具體的演算法
如果你不懂遞歸的話
這個程序就不好懂。
我給出一個遞歸的演算法實現,你看看
#include
"stdio.h"
int
Hanoi(char
x,char
y,char
z,int
n)
{
if(n==1)
//對應第一種可能
{
printf("1:
%c
->%c\n",x,y);
}
else
//對應第二種可能
{
Hanoi(x,z,y,n-1);
//第二種可能的第一中移動方法
printf("%d:
%c
->%c\n",n,x,y);
Hanoi(z,y,x,n-1);
//第二種可能的第二種移動方法
}
return
0;
}
int
main()
{
int
n;
printf("請輸入漢諾塔的高度:");
scanf("%d",&n);
printf("移動方案是:(系數代表第幾個盤子
從上往下計數)\n");
Hanoi('A','B','C',n);
return
0;
}
VC
6.0下編譯成功!
這是典型的遞歸用法。
你看這個程序應該跟明確些。

❷ 用C語言代碼來編寫含漢諾塔問題,利用堆棧來實現.求代碼

演算法思想
對於漢諾塔問題,當只移動一個圓盤時,直接將圓盤從 A 針移動到 C 針。若移動的圓盤為 n(n>1),則分成幾步走:把 (n-1) 個圓盤從 A 針移動到 B 針(藉助 C 針);A 針上的最後一個圓盤移動到 C 針;B 針上的 (n-1) 個圓盤移動到 C 針(藉助 A 針)。每做一遍,移動的圓盤少一個,逐次遞減,最後當 n 為 1 時,完成整個移動過程。
因此,解決漢諾塔問題可設計一個遞歸函數,利用遞歸實現圓盤的整個移動過程,問題的解決過程是對實際操作的模擬。
程序代碼
#include <stdio.h>
int main()
{
int hanoi(int,char,char,char);
int n,counter;
printf("Input the number of diskes:");
scanf("%d",&n);
printf("\n");
counter=hanoi(n,'A','B','C');
return 0;
}
int hanoi(int n,char x,char y,char z)
{
int move(char,int,char);
if(n==1)
move(x,1,z);
else
{
hanoi(n-1,x,z,y);
move(x,n,z);
hanoi(n-1,y,x,z);
}
return 0;
}
int move(char getone,int n,char putone)
{
static int k=1;
printf("%2d:%3d # %c---%c\n",k,n,getone,putone);
if(k++%3==0)
printf("\n");
return 0;
}

❸ 如何做一個C語言編程的漢諾塔游戲

#includex0dx0a void move(char x,char y)x0dx0a {x0dx0a printf("%c-->%c\n",x,y);x0dx0a }x0dx0a void hanoi(int n,char one ,char two,char three)x0dx0a {x0dx0a if(n==1) move(one,three);x0dx0a elsex0dx0a {x0dx0a hanoi(n-1,one,three,two);x0dx0a move(one,three);x0dx0a hanoi(n-1,two,one,three);x0dx0a }x0dx0a }x0dx0a main()x0dx0a {x0dx0a int m;x0dx0a printf("input the number of disks:");x0dx0a scanf("%d",&m);x0dx0a printf("the step to moving %3d diskes:\n",m);x0dx0a hanoi(m,'A','B','C');x0dx0a }x0dx0a演算法介紹:x0dx0a 其實演算法非常簡單,當盤子的個數為n時,移動的次數應等於2^n _ 1(有興趣的可以自己證明試試看)。後來一位美國學者發現一種出人意料的簡單方法,只要輪流進行兩步操作就可以了。首先把三根柱子按順序排成品字型,把所有的圓盤按從大到小的順序放在柱子A上,根據圓盤的數量確定柱子的排放順序:若n為偶數,按順時針方向依次擺放 A B C;x0dx0a 若n為奇數,按順時針方向依次擺放 A C B。x0dx0a (1)按順時針方向把圓盤1從現在的柱子移動到下一根柱子,即當n為偶數時,若圓盤1在柱子A,則把它移動到B;若圓盤1在柱子B,則把它移動到C;若圓盤1在柱子C,則把它移動到A。x0dx0a (2)接著,把另外兩根柱子上可以移動的圓盤移動到新的柱子上。即把非空柱子上的圓盤移動到空柱子上,當兩根柱子都非空時,移動較小的圓盤。這一步沒有明確規定移動哪個圓盤,你可能以為會有多種可能性,其實不然,可實施的行動是唯一的。x0dx0a (3)反復進行(1)(2)操作,最後就能按規定完成漢諾塔的移動。x0dx0a 所以結果非常簡單,就是按照移動規則向一個方向移動金片:x0dx0a 如3階漢諾塔的移動:A→C,A→B,C→B,A→C,B→A,B→C,A→Cx0dx0a 漢諾塔問題也是程序設計中的經典遞歸問題,下面我們將給出遞歸和非遞歸的不同實現源代碼。

❹ 用c語言編寫程序求漢諾塔的移動步驟

#include<stdio.h>
void move(char a,char b)
{
printf("%c->%c\n",a,b);
}
void f(int n,char a,char b,char c)
{
if(n==1) move(a,c);
else
{
f(n-1,a,c,b);
move(a,c);
f(n-1,b,a,c);
}
}
void main()
{
int n;
scanf("%d",&n);
f(n,'a','b','c');
}
這是我的代碼 前面的是定義一個函數 這里遞歸體現在函數裡面還有函數 於是會一次又一次的計算 直到最後把N-1以前的都移到B,最下面的移到C,再把其他的從B移到C。。 無返回的話 應該是這里用void 沒有return返回數值

❺ c語言用遞歸實現漢諾塔

見代碼注釋,還有不懂可以問。

#include<stdio.h>
voidmove(charx,chary)
{
printf("%c-->%c ",x,y);
}
//hannuota函數的作用:把n個圓盤從one柱子藉助two柱子放到three柱子
voidhannuota(intn,charone,chartwo,charthree)
{
if(n==1)//如果只有一個柱子
move(one,three);//直接移動即可
else
{
hannuota(n-1,one,three,two);//先把one柱子上的n-1個圓盤藉助three柱子移動到柱子two
move(one,three);//把第一個柱子的剩下那一個(第n個)移動到第三個柱子
//由於原來one柱子上的n-1個圓盤已經移動到了two柱子上,因此不會有圓盤擋住n圓盤出來
hannuota(n-1,two,one,three);
//最後再把那n-1個圓盤從two柱子藉助one柱子移動到three柱子
//(上面第一句話hannuota(n-1,one,three,two)已經移動到了two柱子,因此這里是從two柱子移動到three柱子)
}
}
intmain()
{
intm;
printf("inputthenumberofdiskes:");
scanf("%d",&m);
printf("Thesteptomove%ddiskes: ",m);
hannuota(m,'A','B','C');
return0;
}

❻ 在C語言中用函數編寫漢諾塔

*問題分析與演算法設計
這是一個著名的問題,幾乎所有的教材上都有這個問題。由於條件是一次只能移動一個盤,且不允許大盤放在小盤上面,所以64個盤的移動次數是:
18,446,744,073,709,551,615
這是一個天文數字,若每一微秒可能計算(並不輸出)一次移動,那麼也需要幾乎一百萬年。我們僅能找出問題的解決方法並解決較小N值時的漢諾塔,但很難用計算機解決64層的漢諾塔。
分析問題,找出移動盤子的正確演算法。
首先考慮a桿下面的盤子而非桿上最上面的盤子,於是任務變成了:
*將上面的63個盤子移到b桿上;
*將a桿上剩下的盤子移到c桿上;
*將b桿上的全部盤子移到c桿上。
將這個過程繼續下去,就是要先完成移動63個盤子、62個盤子、61個盤子....的工作。
為了更清楚地描述演算法,可以定義一個函數movedisc(n,a,b,c)。該函數的功能是:將N個盤子從A桿上藉助C桿移動到B桿上。這樣移動N個盤子的工作就可以按照以下過程進行:
1) movedisc(n-1,a,c,b);
2) 將一個盤子從a移動到b上;
3) movedisc(n-1,c,b,a);
重復以上過程,直到將全部的盤子移動到位時為止。
*程序與程序注釋
#include<stdio.h>
void movedisc(unsigned n,char fromneedle,char toneedle,char usingneedle);
int i=0;
void main()
{
unsigned n;
printf("please enter the number of disc:");
scanf("%d",&n); /*輸入N值*/
printf("\tneedle:\ta\t b\t c\n");
movedisc(n,'a','c','b'); /*從A上藉助B將N個盤子移動到C上*/
printf("\t Total: %d\n",i);
}
void movedisc(unsigned n,char fromneedle,char toneedle,char usingneedle)
{
if(n>0)
{
movedisc(n-1,fromneedle,usingneedle,toneedle);
/*從fromneedle上藉助toneedle將N-1個盤子移動到usingneedle上*/
++i;
switch(fromneedle) /*將fromneedle 上的一個盤子移到toneedle上*/
{
case 'a': switch(toneedle)
{
case 'b': printf("\t[%d]:\t%2d.........>%2d\n",i,n,n);
break;
case 'c': printf("\t[%d]:\t%2d...............>%2d\n",i,n,n);
break;
}
break;
case 'b': switch(toneedle)
{
case 'a': printf("\t[%d]:\t%2d<...............>%2d\n",i,n,n);
break;
case 'c': printf("\t[%d]:\t %2d........>%2d\n",i,n,n);
break;
}
break;
case 'c': switch(toneedle)
{
case 'a': printf("\t[%d]:\t%2d<............%2d\n",i,n,n);
break;
case 'b': printf("\t[%d]:\t%2d<........%2d\n",i,n,n);
break;
}
break;
}
movedisc(n-1,usingneedle,toneedle,fromneedle);
/*從usingneedle上藉助fromneedle將N-1個盤子移動到toneedle上*/
}
}

❼ C語言漢諾塔問題非遞歸解法代碼求大神講解

int game2()要改為int main()後才可編譯運行:

#include<stdio.h>

#include<stdlib.h>

#define CSZL 10

#define FPZL 10


typedef struct hanoi

{

int n;

char x,y,z;

}hanoi;

typedef struct Stack //定義棧結點

{

hanoi *base,*top;

int stacksize;

}Stack;

int InitStack(Stack *S)


{

S->base=(hanoi *)malloc(CSZL*sizeof(hanoi)); //申請棧空間

if(!S->base) //若申請不成功返回失敗信息

return 0;

S->top=S->base; //置為空棧

S->stacksize=CSZL; //棧結點數

return 1;

}

int PushStack(Stack *S,int n,char x,char y,char z) //入棧

{

if(S->top-S->base==S->stacksize) //若棧已滿

{

S->base=(hanoi *)realloc(S->base,(S->stacksize+FPZL)*sizeof(hanoi)); //補充申請,擴充棧空間

if(!S->base) //若申請不成功返回失敗信息

return 0;

S->top=S->base+S->stacksize; //重置棧頂指針

S->stacksize+=FPZL; //重置棧空間尺寸

}

S->top->n=n; //新結點信息存入棧頂結點

S->top->x=x;

S->top->y=y;

S->top->z=z;

S->top++; //棧中元素加1

return 1;

}

int PopStack(Stack *S,int *n,char *x,char *y,char *z) //出棧

{

if(S->top==S->base) //若棧已空

return 0; //返回出錯信息

else

{

S->top--; //棧頂指針減1

*n=S->top->n; //返回出棧元素信息

*x=S->top->x;

*y=S->top->y;

*z=S->top->z;

return 1;

}

}

int EmptyStack(Stack *S) //判定是否空棧

{

if(S->base==S->top)

return 1;

else

return 0;

}

int i=1;

void Move(char x,char z) //列印移動盤子的信息

{

printf(" 第%d步,%c-->%c",i++,x,z);


}


int main() /* 非遞歸法 */

{

int n;


char x,y,z;


Stack *S;


system("cls"); /*清屏指令*/


S=(Stack *)malloc(sizeof(Stack)); //申請棧空間


if(!S)

return 0;


if(!InitStack(S)) //初始化棧

return 0;


printf("請輸入漢諾塔的初始盤子數量以及軸的名稱:");


scanf("%d %c%c%c",&n,&x,&y,&z);


if(!PushStack(S,n,x,y,z)) //要移動的盤子數及各軸名稱入棧

return 0;


while(!EmptyStack(S)) //當棧非空時循環

{

if(!PopStack(S,&n,&x,&y,&z)) //若空棧則退出循環,否則出棧一個任務

break;

if(n==1) //若只有一個盤子,直接移動

{

Move(x,z);

}

else //有1個以上的盤子時入棧(注意棧的工作特點,是後進先出,所以最先做的事要最後入棧)

{

if(!PushStack(S,n-1,y,x,z)) //將上層的n-1個盤子從y移向z

break;

if(!PushStack(S,1,x,y,z)) //將底層的盤子從x移向z

break;

if(!PushStack(S,n-1,x,z,y)) //將上層的n-1個盤子從x移向y

break;

}

}

free(S->base);

S->base=NULL;

S->top=NULL;

S->stacksize=0;

return 0;

}

❽ C語言關於漢諾塔的小程序

void main()
{
int n;
printf("please input number: ");
scanf("%d",&n);
printf("the stemp is :\n");
hounit(n,'a','b','c');
}沒有太大問題 下次注意一點就行了 n前面一定要加上&

❾ 漢諾塔的C語言代碼怎麼寫啊

/*5. 源程序*/
/********hanoi.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();/*初始狀態*/
Close();/*圖形關閉*/
exit(0);
}
void Init(void)/*初始化*/
{
int gd=DETECT,gm;
int i,n,color;
clrscr();
printf("please input n(n<=10): ");/*輸入要演示的盤子數*/
scanf("%d",&n);
printf("Please input 1 or 2:\n1.computer 2.people\n");
scanf("%d",&i);
if(i==2)/*選擇手動控制標志為0*/
computer=0;
if(n<1||n>10)
n=10;/*越界的話n當10處理*/
if(computer)/*如果是自動控制的話輸入速度*/
{
printf("please input speed: ");/*輸入速度*/
scanf("%d",&speed);
}
initgraph(&gd,&gm,"c:\\tc");
cleardevice();
for(i=0;i<3;i++)
num[i].top=-1;/*三個地方的高度開始都為-1*/
for(i=0;i<n;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();/*接收字元後就執行遞歸操作*/
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);/*將小寫變成大寫,並轉換成字元串輸出*/
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);/*延時函數*/
else
getch();/*手動控制的話就自己按鍵盤來控制*/
}
void hanoi(char one,char two,char three,int n,struct H num[3])/*遞歸n為盤子數,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語言漢諾塔程序

將以下內容全部復制到新建的源文件中:(本人自己寫的,因為你那課本上的代碼,沒解釋,書寫不規范,很難理解清楚,所以我直接新寫了一個完整的代碼,附帶詳細說明)
#include <stdio.h>
//漢諾塔x層塔從A塔整體搬到C塔,中間臨時B塔。
//x層塔是從大到小往上疊放。每次移動只能移動一層塔。並且在移動過程中必須保證小層在上邊
//藉助B塔可以將x層塔全部從A搬到C上,並且符合要求(在移動過程中大的那塊在下邊,小的那塊在上邊)
int main()
{
void tower(int x,char a,char b,char c); //聲明函數
int x=5,a='A',b='B',c='C'; //x表示有5層塔,具體要多少層自己修改這個值。abc分別表示ABC塔。

tower(x,a,b,c); //x層塔從a移動到c的全過程,主程序只有這條有效語句

return 0;
}

//以下是tower函數的定義
//參數解析:x層塔放在a上,b是中間塔,c是目標塔。即x層塔要從a搬到c上。
//此函數實現x層塔從a整體轉移到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按照規律搬到b上,再將最後一塊從a搬到c上,最後再將b上的x-1層塔按照規律搬到c上。
{
tower(x-1,a,c,b); //先將x-1層塔從a按照規律搬到b上,注意參數b放在最後,因為放在最後的參數是准備搬過去的目標塔。
printf("將%d從%c放到%c\n",x,a,c); //將最後一塊從a搬到c上
tower(x-1,b,a,c); //最後再將b上的x-1層塔按照規律搬到c上,注意參數b放在開頭,因為x-1層是要從b上搬過去的。
}
}

熱點內容
java返回this 發布:2025-10-20 08:28:16 瀏覽:710
製作腳本網站 發布:2025-10-20 08:17:34 瀏覽:972
python中的init方法 發布:2025-10-20 08:17:33 瀏覽:681
圖案密碼什麼意思 發布:2025-10-20 08:16:56 瀏覽:833
怎麼清理微信視頻緩存 發布:2025-10-20 08:12:37 瀏覽:740
c語言編譯器怎麼看執行過程 發布:2025-10-20 08:00:32 瀏覽:1080
郵箱如何填寫發信伺服器 發布:2025-10-20 07:45:27 瀏覽:311
shell腳本入門案例 發布:2025-10-20 07:44:45 瀏覽:191
怎麼上傳照片瀏覽上傳 發布:2025-10-20 07:44:03 瀏覽:878
python股票數據獲取 發布:2025-10-20 07:39:44 瀏覽:835