hanoi塔问题
有三根针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 }