题目描述 有三根标为A,B,C的柱子,A柱子上从上到下按金字塔状依次叠放着n个半径从1厘米到n厘米的的圆盘,要把A上的所有盘子移动到柱子C上,中间可以临时放在B上,但每次移动每一根柱子上都不能出现大盘子在小盘子上方的情况,要求用最少的移动次数完成,请编程模拟每次移动。 输入 占一行,为整数n(n<64),表示盘子数。 输出 把A上的所有盘子移动到柱子C上,每次只能移动一个盘子,输出移动每一次过程。每次移动占一行,第一个数表示第几步移动,第二个数是移动的盘子的半径,然后是从哪个柱子移动到哪个柱子。 样例输入 2 样例输出 1 1 A->B 2 2 A->C 3 1 B->C 请使用c++来完成该问题
时间: 2024-03-16 16:47:36 浏览: 115
为什么柱子上下两端箍筋加密中间不加密?.docx
以下是使用 C++ 解决汉诺塔问题的代码:
```c++
#include <iostream>
using namespace std;
void move(int n, char from, char to, char temp, int &step) {
if (n == 1) {
cout << ++step << " " << n << " " << from << "->" << to << endl;
return;
}
move(n - 1, from, temp, to, step);
cout << ++step << " " << n << " " << from << "->" << to << endl;
move(n - 1, temp, to, from, step);
}
int main() {
int n;
cin >> n;
int step = 0;
move(n, 'A', 'C', 'B', step);
return 0;
}
```
这个程序分为两个部分。`move` 函数是一个递归函数,用于将 n 个盘子从柱子 from 移动到柱子 to,其中的 temp 为临时柱子。在递归的过程中,我们需要先将 n-1 个盘子从 from 移动到 temp,再将最后一个盘子从 from 移动到 to,最后再将 n-1 个盘子从 temp 移动到 to。当 n=1 时,我们直接将最后一个盘子从 from 移动到 to 即可。
在主函数中,我们读取输入的 n,然后调用 `move` 函数,从 A 柱子移动到 C 柱子。我们定义了一个名为 step 的变量,用于记录移动步数,并将其初始化为 0。在 `move` 函数中,每次移动一个盘子我们就将 step 加 1,并输出当前移动的步数、盘子半径以及移动来源和目的地。最后,我们在主函数中返回 0,表示程序正常结束。
阅读全文