漢諾塔問題(棧和遞迴的實現)
阿新 • • 發佈:2018-11-07
前邊寫的數值轉換是利用棧的先進後出的性質儲存數字的各位數,行編輯是利用棧的只允許在一端進行操作的特性,迷宮問題中棧儲存走過的通道塊,棧還可以輔助遞迴的實現,漢諾塔就是一個典型的例子
漢諾塔問題描述:塔X上的圓盤全部移動到塔Z,且移動過程中,小盤始終位於大盤上方。解決思路就是欲將n個圓盤從X移動到Z,只需先移動前n-1個圓盤到輔助塔Y,再將剩下的一個圓盤從X移動到Z,最後再以X作為輔助塔,將餘下的n-1個圓盤從Y移動到Z
Hanoi.h檔案
/********************************** 檔案路徑:3 棧和佇列\Hanoi 檔名稱:Hanoi.h 實現功能:宣告漢諾塔程式中需要用的函式 編寫時間:2018.8.14 **********************************/ #ifndef HANOI_H #define HANOI_H #include<stdio.h> int gStep;//統計移動步數(全域性變數) //將塔座x上按直徑有小到大且自上而下編號為1至n的n個圓盤按規則搬到塔座z上,y可用作輔助塔座 void hanoi(int n,char x,char y,char z); //把第n個圓盤從x移到z void move(char x,int n,char z); #endif
Hanoi.cpp檔案
/********************************** 檔案路徑:3 棧和佇列\Hanoi 檔名稱:Hanoi.cpp 實現功能:實現漢諾塔程式中需要用的函式 編寫時間:2018.8.14 **********************************/ #ifndef HANOI_CPP #define HANOI_CPP #include"Hanoi.h" //將塔座x上按直徑有小到大且自上而下編號為1至n的n個圓盤按規則搬到塔座z上,y可用作輔助塔座 void hanoi(int n,char x,char y,char z){ if(n==1) move(x,1,z);//把編號為1的圓盤從x移到z else{ hanoi(n-1,x,z,y);//把x上編號為1至n-1的圓盤移到y,z作輔助塔 move(x,n,z);//將編號為n的圓盤從x移到z hanoi(n-1,y,x,z); } } //把第n個圓盤從x移到z void move(char x,int n,char z){ gStep++; printf("Move disk %d from %c to %c\n",n,x,z); } #endif
Hanoi-Test.cpp檔案
/********************************** 檔案路徑:3 棧和佇列\Hanoi 檔名稱:Hanoi-Test.cpp 實現功能:測試漢諾塔演算法 編寫時間:2018.8.14 **********************************/ #include"Hanoi.cpp" int main(){ int n=5;//假設有5個圓盤 char x='x'; char y='y'; char z='z'; printf("將%d個圓盤從x塔座移到z塔座的操作步驟如下:\n",n); hanoi(n,x,y,z); printf("共用了%d步\n",gStep); return 0; }