C語言漢諾塔問題,用C語言實現(xiàn)漢諾塔
漢諾塔問題是指:一塊板上有三根針 A、B、C。A 針上套有 64 個大小不等的圓盤,按照大的在下、小的在上的順序排列,要把這 64 個圓盤從 A 針移動到 C 針上,每次只能移動一個圓盤,移動過程可以借助 B 針。但在任何時候,任何針上的圓盤都必須保持大盤在下,小盤在上。從鍵盤輸入需移動的圓盤個數(shù),給出移動的過程。
算法思想
對于漢諾塔問題,當(dāng)只移動一個圓盤時,直接將圓盤從 A 針移動到 C 針。若移動的圓盤為 n(n>1),則分成幾步走:把 (n-1) 個圓盤從 A 針移動到 B 針(借助 C 針);A 針上的最后一個圓盤移動到 C 針;B 針上的 (n-1) 個圓盤移動到 C 針(借助 A 針)。每做一遍,移動的圓盤少一個,逐次遞減,最后當(dāng) n 為 1 時,完成整個移動過程。
因此,解決漢諾塔問題可設(shè)計一個遞歸函數(shù),利用遞歸實現(xiàn)圓盤的整個移動過程,問題的解決過程是對實際操作的模擬。
程序代碼
#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;
}
調(diào)試運行結(jié)果
當(dāng)移動圓盤個數(shù)為 3 時,具體移動步驟如下所示:
Input the number of diskes:3
1: 1 # A---C
2: 2 # A---B
3: 1 # C---B
4: 3 # A---C
5: 1 # B---A
6: 2 # B---C
7: 1 # A---C
總結(jié)
本實例中定義的 hanoi() 函數(shù)是一個遞歸函數(shù),它有四個形參"n""x""y""z"。"n" 是移動的圓盤個數(shù),"x""y""z" 分別表示三根針,其功能是把 x 上的 n 個圓盤移動到 z 上。當(dāng) n=1 時,直接把 x 上的圓盤移到 z 上,輸出"x---Z"。當(dāng) n!=1 時,則遞歸調(diào)用 hanoi() 函數(shù),把 (n-1) 個圓盤從 x 移到 y,輸出"x—-z";再遞歸調(diào)用 hanoi() 函數(shù),把 (n-1) 個圓盤從 y 移到 z。在遞歸調(diào)用函數(shù)的過程中"n=n-1",n 的值逐次遞減,最后 n=1,終止遞歸調(diào)用,逐層返回,移動過程結(jié)束。
作者:大學(xué)生新聞網(wǎng) 來源:大學(xué)生新聞網(wǎng)
- C語言日期函數(shù),日期處理函數(shù)
- 定義一個表示日期的結(jié)構(gòu)體類型,再分別定義函數(shù)完成下列功能:計算某一天是對應(yīng)年的第幾天,這一年一共多少天;計算兩個日期之間相隔的
- 03-10 關(guān)注:0
- C語言求空間兩點之間的距離
- 定義一個表示三維空間點坐標的結(jié)構(gòu)類型,通過函數(shù)求空間上任意兩點之間的距離。
- 03-10 關(guān)注:0
- C語言求定積分
- 利用梯形法計算定積分
- 03-10 關(guān)注:0
- C語言三色旗問題
- 有一根繩子,上面有紅、白、藍三種顏色的旗子。
- 03-10 關(guān)注:1
- C語言整數(shù)逆序輸出
- 將一個從鍵盤輸入的整數(shù)存放到一個數(shù)組中,通過程序的運行按照數(shù)組中的逆序輸出該整數(shù),利用遞歸的方法解決問題。
- 03-10 關(guān)注:1
- C語言約瑟夫環(huán)問題
- 編號為 1,2,3,…,n 的 n 個人圍坐一圈,任選一個正整數(shù) m 作為報數(shù)上限值,從第一個人開始按順時針方向報數(shù),報數(shù)到 m 時停止,報
- 03-10 關(guān)注:1