c++ 汉诺塔 迭代 使用from by to三个变量模拟柱子,用栈
时间: 2024-09-18 15:09:03 浏览: 39
在C++中,使用`from`、`by`和`to`这三个变量来表示汉诺塔问题中的三个柱子(A、B和C),并利用栈数据结构实现迭代的方法叫做迭代加深搜索(Iterative Deepening)。这种方法结合了递归和深度优先搜索的思想,通过逐层增加搜索深度的方式避免栈溢出的问题,同时保持递归的简洁性。
下面是一个基本的C++代码示例,展示了如何使用栈来模拟这个过程:
```cpp
#include <stack>
using namespace std;
void moveDisk(int from, int to, int aux, int n) {
cout << "Moving disk " << n << " from column " << from << " to column " << to << endl;
}
void hanoiIterative(int n, string from, string to, string aux) {
stack<pair<string, int>> moves;
moves.push({from, n});
while (!moves.empty()) {
string src = moves.top().first;
int size = moves.top().second;
if (size == 1) {
moves.pop(); // 盘子已移动完毕
moveDisk(src, to, aux, size);
} else {
moves.pop(); // 提取当前层级的任务
moveDisk(src, aux, to, size - 1); // 第一步:将小盘子从src移动到aux
moves.push({aux, size - 1}); // 记录辅助柱子的剩余任务
moves.push({src, 1}); // 第二步:将剩下的大盘子移动到to
moveDisk(src, to, aux, 1);
moves.pop(); // 回溯至上一层,将大盘子从to移到aux
moves.push({to, size - 1});
moveDisk(to, aux, src, size - 1); // 第三步:将大盘子从to移到src
}
}
}
int main() {
int numDisks = 3; // 示例3盘汉诺塔
hanoiIterative(numDisks, "A", "C", "B");
return 0;
}
```
阅读全文