有三根針A、B、C。A針上有N個盤子,大的在下,小的在上,要求把這N個盤子從A針移到C針,在移動過程中可以借助B針,每次只允許移動一個盤,
且在移動過程中在三根針上都保持大盤在下,小盤在上。
- 將n 個盤子從A針移到C針可以分解為三個步驟:
- 將A 上n-1個盤子移到 B針上(借助C針);
- 把A針上剩下的一個盤子移到C針上;
- 將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 }