hanoi塔問題


 

  有三根針A、B、C。A針上有N個盤子,大的在下,小的在上,要求把這N個盤子從A針移到C針,在移動過程中可以借助B針,每次只允許移動一個盤,

且在移動過程中在三根針上都保持大盤在下,小盤在上。

   

  • 將n 個盤子從A針移到C針可以分解為三個步驟:
  1. 將A 上n-1個盤子移到 B針上(借助C針);
  2. 把A針上剩下的一個盤子移到C針上;
  3. 將n-1個盤子從B針移到C針上(借助A針)。

  使用遞歸將上述三個步驟實現即可。

C++代碼如下:

 

 1 #include<iostream>
 2 using namespace std;
 3 
 4 unsigned step = 1;  //記錄移動的次數
 5 
 6 void move(char src, char dest) {  //模擬把盤子從 src針上移動到dest 針上
 7     cout << step<<": "<<src << " ---> " << dest << endl;
 8     step++;
 9 }
10 
11 void hanoi(unsigned n, char src, char medi, char dest) {
12     if (n == 1) move(src, dest);        //只有一個盤子,直接從src針移動到dest針
13     else {
14         hanoi(n - 1, src, dest, medi);  //借助dest針把n-1個盤子從src針上移動到medi針上
15         move(src, dest);                //將第n個盤子從src針移動到dest針
16         hanoi(n - 1, medi, src, dest);    //借助src針將medi上的n-1個盤子移動到dest針上
17     }
18 }
19 
20 int main() {
21     unsigned n;
22     cin >> n;
23     hanoi(n,'A','B','C');
24     return 0;
25 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM