⑴ 漢諾塔c語言演算法。注意是演算法
void hanoi (int n; char x, char y,char z)
/* 將塔座x上按直徑由小到大且至上而下編號為1至n的
n個圓盤按規則搬到塔座z上,y可用作輔助塔座。*/
1 {
2 IF (n==1)
3 move(x, 1, z); /*將1號盤從x移到z*/
4 ELSE {
5 hanoi(n-1, x, z, y); /*將x上n-1個盤移到y, z作輔助塔*/
6 move(x, n, z); /*將n號圓盤從x移到z*/
7 hanoi(n-1, y, x, z); /*將y上n-1個盤移到z, x作輔助塔*/
8 }
}
⑵ 關於c語言的漢諾塔應用
這樣跟你說吧,如果搬3個盤子就要搬七次,四個盤子就是十五次。
公式是:pow(2,n)-1;//n代表一共有幾個盤子
⑶ c語言漢諾塔.
# include <stdio.h>
void hannuota(int n,char A,char B, char C);
int main(void)
{
char ch1 = 'A';
char ch2 = 'B';
char ch3 = 'C';
int n;
printf("請輸入要移動的盤子的個數:");
scanf("%d",&n);
hannuota(n,'A','B','C');
return 0;
}
//將A柱子上的n個盤子藉助於B移動到C柱子上,
//每次移動時,必須保證大盤子在小盤子下面
//最大值不能是64
void hannuota(int n,char A,char B,char C)
{
/*
如果是1個盤子
直接將A柱子上的盤子從A移動到C
否則
先將A柱子上的n-1個盤子藉助於C從A移動到B
直接將A柱子上的盤子從A移動到C
最後將B柱子上的n-1個盤子藉助於A從B移動到C
*/
if (1 == n)
{
printf("將編號為%d的盤子從%c柱子移動到%c柱子\n",n,A,C);
}
else
{
hannuota(n-1,A,C,B);
printf("將編號為%d的盤子從%c柱子移動到%c柱子\n",n,A,C);
hannuota(n-1,B,A,C);
}
}
/*
在vc++6.0中的輸出結果:
------------------
請輸入要移動的盤子的個數:3
將編號為1的盤子從A柱子移動到C柱子
將編號為2的盤子從A柱子移動到B柱子
將編號為1的盤子從C柱子移動到B柱子
將編號為3的盤子從A柱子移動到C柱子
將編號為1的盤子從B柱子移動到A柱子
將編號為2的盤子從B柱子移動到C柱子
將編號為1的盤子從A柱子移動到C柱子
-------------------
*/
/*
供參考! 呵呵
*/
⑷ 求救c語言(4柱子漢諾塔問題)是高手就來
漢諾塔問題用遞歸很容易就解決了,否則太麻煩了,你可以用遞歸試試
⑸ 漢諾塔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語言漢諾塔(高分提問)
其實漢諾塔就是遞歸問題,你理解了遞歸思想,自然就很容易懂,這種問題一般都作為編程語言教程的遞歸例子講解的,你其實可以仔細看看課本的.
hanio(n-1,a,c,b);// 這語句的意思是:首先將a 上面的n-1個盤通過c 移動到b ,這樣的結果是,a 只剩下最大一塊盤,然後直接移動到c就行了,所以也就有move(a,c); 之後a 為空,b 有剛才移動的n-1個盤,c 上面已經有個最大的了,如果把剩下的n-1移動到c ,就完成了,所以接著有下面的語句:
hanio(n-1,b,a,c); //這意思說,把b 上的n-1個盤通過a 移動到c,
就這樣完成遞歸,一次次執行下去,就行了.
⑺ 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語言的問題
設f(n, a, b,c) 表示 把n個盤從a移到c 藉助b ,它等於三個步驟
1.n-1個盤從a移到b
2 1個盤從a移到c
3 n-1個盤從b移到c
看第一個步驟,n-1個盤從a移到b,設為g(n-1,a,c,b),它又等於三個步驟
n-2個盤從a移到c
1個盤從a移到b
n-1個盤從c移到b
這三個步驟恰恰是盤子為n-1時,從a移到b藉助c的步驟,就是說,這三個步驟等於f(n-1,a,c,b)
所以g(n-1,a,c,b)=f(n-1,a,c,b),進而推的
f(n, a, b,c) = ( f(n-1, a,c,b) , f(1, a, b,c), f(n-1, b,a,c))
自己參悟吧,很簡單的。
⑼ 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上搬過去的。
}
}