當前位置:首頁 » 編程語言 » 河內塔c語言
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

河內塔c語言

發布時間: 2022-09-11 23:09:18

⑴ 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上搬過去的。
}
}

⑵ C語言--漢諾塔程序執行步驟

這個問題你要先把遞歸搞懂才能理解的, 最好是單跟蹤執行一下, 我這里就簡單說一下吧!
hanoi(5, 'a', 'b', 'c');把5個從'a'移到'c'
這時n=5, noe='a', two='b', three='c'
因為n!=1, 執行else里的
hanoi( 4, 'a', 'c', 'b'); //把上面4個從a移到b
move( 'a', 'c'); //把第5個從a移到c
hanoi( 4, 'b', 'a', 'c'); //再把那4個從b移到c
上面的很好明白的, 再分析hanoi( 4, 'a', 'c', 'b'); //把上面4個從a移到b,也是執行else
hanoi( 3, 'a', 'b', 'c'); //把上面3個從a移到c
move( 'a', 'b'); //把第4個從a移到b
hanoi( 4, 'c', 'a', 'b'); //再把那3個從c移到b

一直到n=1才結束

⑶ 誰能解釋一下C語言漢諾塔問題

這個是3柱漢諾塔,有A、B、C三個柱子,n個大小不一的盤子從大到小向上疊放在A柱上,規則是只有小號盤子可以放在大號盤子上,反之不行,最終將n個盤子挪到B柱上。 挪動方法即先將上面的n-1個盤子挪到C柱上,再把n號最大的盤子挪到B柱上,再把那n-1個盤子從C柱上挪到B柱上。挪動這n-1個盤子實際也是同樣的3柱漢諾塔問題,只不過是先從A到C藉助B,再從C到B藉助A。n-1個盤子挪動採用同樣的策略,把他上面n-2個盤子挪到藉助的柱子上,把n-1號盤子挪到目標柱子上,再把剛n-2個盤子也挪到目標柱子上。把問題分解直至n-(n-2)即2個盤子的挪動,就可以直接挪動了,即1號盤子挪到藉助的柱子,2號盤子挪到目標柱子上,再把1號盤子也挪到目標柱子上。 這樣就可以調用遞歸方法逐漸減小問題的規模,最後直接操作。

⑷ C語言漢諾塔

根據漢諾塔的游戲規則可知,若只有一個盤子,則只要直接搬運就可以了,其它的不需要再做。return語句的作用,就是遇到它時,程序直接返回到調用它的地方,不再執行此函數中return語句以後的代碼。

不過這里這個return語句也可以不寫,只是代碼要稍作更改(代碼的執行還是不變的,即與更改前完全等價):

voidhanNuoTa(intn,charfrom,charto,charhelper)
{
if(n==1)
{
printf("%c--->%c ",from,to);
}
else
{
hanNuoTa(n-1,from,helper,to);
printf("%c--->%c ",from,to);
hanNuoTa(n-1,helper,to,from);
}
}

⑸ C語言實驗題——漢諾塔

【例】Hanoi塔問題
一塊板上有三根針,A,B,C。A針上套有64個大小不等的圓盤,大的在下,小的在上。如圖5.4所示。要把這64個圓盤從A針移動C針上,每次只能移動一個圓盤,移動可以藉助B針進行。但在任何時候,任何針上的圓盤都必須保持大盤在下,小盤在上。求移動的步驟。
本題演算法分析如下,設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(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。n表示圓盤數,x,y,z分別表示三根針。move 函數的功能是把x上的n個圓盤移動到z上。當n==1時,直接把x上的圓盤移至z上,輸出x→z。如n!=1則分為三步:遞歸調用move函數,把n-1個圓盤從x移到y;輸出x→z;遞歸調用move函數,把n-1個圓盤從y移到z。在遞歸調用過程中n=n-1,故n的值逐次遞減,最後n=1時,終止遞歸,逐層返回。當n=4 時程序運行的結果為:
input number:
4
the step to moving 4 diskes:
a→b
a→c
b→c
a→b
c→a
c→b
a→b
a→c
b→c
b→a
c→a
b→c
a→b
a→c
b→c

⑹ C語言漢諾塔(又稱河內塔)問題

#include<stdio.h>
void move(int n,char a,char b)
{

printf("Move disk %d from %c to %c\n",n,a,b);

}
void hanoi(int n,char a,char b,char c)
{
if(n == 1) //你缺少這個,不然遞歸不起來,當n==1的時候
{
move(n,a,c);

}

else
{
hanoi(n-1,a,c,b);
move(n,a,c);
hanoi(n-1,b,a,c);
}
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
hanoi(n,'A','B','C');
return 0;
}

⑺ C語言漢諾塔問題,不是很理解

首先你得明白這是用函數遞歸調用的方法,遞歸就不用我說了,看代碼
void
hanoi(int
n,char
one,char
two,char
three)
{
void
move(char
x,char
y);
if(n==1)
move(one,three);
//這個if語句,當盤子只有一個的時候,當然直接從第一根柱子(one)移到第//三根柱子(three)上就ok了,move(one,three)就這個意思!
else
{
hanoi(n-1,one,three,two);//當有n個盤子,按照遞歸法,調用hannoi,先把//上面的n-1個盤子從第一根柱子(one)藉助第三根柱子(three)移到第二根柱//子上(two)。
move(one,three);//上面已把n-1個盤子移到第二根柱子上了,再將第一根柱//子剩下的一個盤子也就是最大的盤子從one移到three,明白?
hanoi(n-1,two,one,three);
/*移動好了最大的一個盤子,剩下n-1個盤子在two上,這時我們可以把第二根柱子與第一個柱//子的位置交換下,也就是標號為two的排第一,one排第二,three排第三。
這里的hanoi(n-1,two,one,three)對應
void
hanoi(int
n,char
one,char
two,char
three),只是盤子變成n-1
個,標號為two的柱子排第一了,下面要做的就是把two上上面的n-2個盤子藉助three移到one上,再把剩下的一個移到第三個,再調換one
和two位置。
如此重復!注意轉換位置只是我們頭腦中的想像,程序本身沒有轉換柱子位置,編程完全按照標號(one
two
three)來實現的,我這樣寫只是便於理解遞歸過程,不知道是否理解?*/
}
}
void
move(char
x,char
y)
{
printf("%c-->%c\n",x,y);
}
/*move
函數只是起到一個列印步驟的作用,one對應『a』,。。,比如move(one,two),就會列印出a-->b
*/
上面有些是我自己理解時的一些想法,希望能幫到你,實際你把代碼對照演算法多看幾次就ok了,很容易的,理解了自己都可以寫出來

⑻ C語言漢諾塔問題,請問這個n=3的詳細步驟是什麼呀,大一新生沒聽懂

這是漢諾塔的演算法的問題。程序本身很簡單。

漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。

這個主要是看演算法,再一個就是遞歸的學習,程序本身非常簡單。