Ⅰ c語言 實現漢諾塔
#include<stdio.h>
void main()
{
void hanoi(int n,char one,char two,char three);
int n;
printf("please input the number of diskes:\n");
scanf("%d",&n);
printf("the steps to moving is:\n");
hanoi(n,'A','B','C');
}
void hanoi(int n,char one ,char two ,char three)//把n個盤子從 one藉助two移動到there
{
void move(char a,char b);
if(n==1) move(one,three);
else
{
hanoi(n-1,one,three,two);//把n-1個盤子從 one藉助there移動到two
move(one,three);
hanoi(n-1,two,one,three);//把n-1個盤子從 two藉助one移動到there
}
}
void move(char a,char b)
{
printf("%c-->%c\n",a,b);
}
Ⅱ 如何做一個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
漢諾塔問題也是程序設計中的經典遞歸問題,下面我們將給出遞歸和非遞歸的不同實現源代碼。
Ⅲ 用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語言代碼來編寫含漢諾塔問題,利用堆棧來實現.求代碼
演算法思想
對於漢諾塔問題,當只移動一個圓盤時,直接將圓盤從 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語言漢諾塔怎麼理解拜託各位大神
首先你得明白這是用函數遞歸調用的方法,遞歸就不用我說了,看代碼
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了,很容易的,理解了自己都可以寫出來
Ⅵ 漢諾塔n=4(4個盤)c語言遞歸編程代碼
/****************************
漢諾塔的演算法就3個步驟:
第一,把a上的n-1個盤通過c移動到b。
第二,把a上的最下面的盤移到c。a成了空的。
第三,因為n-1個盤全在b上了,所以把b當做a.
重復以上步驟就好了。所以演算法看起來就簡單多了。
******************************/
#include<stdio.h>
staticintm=0;
voidmove(intn,chara,charb,charc)
{
if(n==1)
{
m++;
printf("第%d次移動: ",m);
printf(" %c->%c ",a,c);//當n只有1個的時候直接從a移動到c
}
else
{
move(n-1,a,c,b);//第n-1個要從a通過c移動到b
m++;
printf("第%d次移動: ",m);
printf(" %c->%c ",a,c);
move(n-1,b,a,c);//n-1個移動過來之後b變開始盤,b通過a移動到c,這邊很難理解
}
}
intmain()
{
intn=4;
//printf("請輸入要移動的塊數:");
//scanf("%d",&n);
move(n,'a','b','c');
return0;
}
Ⅶ C語言編程(漢諾塔問題)
move(n-1,x,z,y);——這句是調用函數,這個函數就是前面聲明的:void move(int n,int x,int y,int z)
printf("%c-->%c",x,z);——這句是輸出,%c 是指按CHAR型輸出,"%c-->%c",就是輸出兩個CHAR型數據,中間用-->連接。而這兩個CHAR的數據就是x和z。比如結果是:a-->c
move(n-1,y,x,z);——這句還是調用函數,這個函數就是前面聲明的:void move(int n,int x,int y,int z)
Ⅷ 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語言漢諾塔程序
將以下內容全部復制到新建的源文件中:(本人自己寫的,因為你那課本上的代碼,沒解釋,書寫不規范,很難理解清楚,所以我直接新寫了一個完整的代碼,附帶詳細說明)
#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)是必須用遞歸方法才能解決的經典問題。它來自於印度神話。上帝創造世界時作了三根金剛石柱子,在第一根柱子上從下往上按大小順序摞著64片黃金圓盤,如圖7-3所示。上帝命令婆羅門把圓盤從下面開始按大小順序重新擺放到第二根柱子上,並且規定,每次只能移動一個圓盤,在小圓盤上不能放大圓盤。有人預言說,這件事完成時宇宙會在一瞬間閃電式毀滅,也有人相信婆羅門至今仍在一刻不停地搬動著圓盤。
**輸入格式要求:"%d" 提示信息:"Input the number of disks:"
**輸出格式要求:"Steps of moving %d disks from A to B by means of C:
" "Move %d: from %c to %c
"
程序運行示例如下:
Input the number of disks:3
Steps of moving 3 disks from A to B by means of C:
Move 1: from A to B
Move 2: from A to C
Move 1: from B to C
Move 3: from A to B
Move 1: from C to A
Move 2: from C to B
Move 1: from A to B