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 }

猜你喜欢

转载自www.cnblogs.com/pgzhang/p/9071593.html