用c++写一下汉诺塔问题
时间: 2023-08-04 11:19:18 浏览: 47
好的,以下是用C++实现汉诺塔问题的代码:
```c++
#include <iostream>
using namespace std;
void hanoi(int n, char a, char b, char c) {
if (n == 1) {
cout << a << " -> " << c << endl;
return;
}
hanoi(n - 1, a, c, b);
cout << a << " -> " << c << endl;
hanoi(n - 1, b, a, c);
}
int main() {
int n; // 汉诺塔层数
cout << "请输入汉诺塔的层数:";
cin >> n;
hanoi(n, 'A', 'B', 'C');
return 0;
}
```
在这个代码中,我们定义了一个 `hanoi` 函数,它的参数 `n` 表示汉诺塔的层数,`a`、`b`、`c` 分别表示三个柱子的名称。在 `n` 等于 1 的时候,我们直接将第一个柱子上的盘子移动到第三个柱子上;否则,我们将 `n-1` 层的盘子从第一个柱子移动到第二个柱子上,再将第 `n` 层的盘子从第一个柱子移动到第三个柱子上,最后再将 `n-1` 层的盘子从第二个柱子移动到第三个柱子上,这样就完成了整个移动过程。
在 `main` 函数中,我们先让用户输入汉诺塔的层数,然后调用 `hanoi` 函数进行移动。
相关问题
用c++写一下汉诺塔问题,要求移动汉诺塔的步骤 每行显示一步操作,具体格式为: 盘片号: 起始柱 -> 目的柱 其中盘片号从 1 开始由小到大顺序编号。
好的,以下是用C++实现汉诺塔问题并按照要求输出每一步操作的代码:
```c++
#include <iostream>
using namespace std;
void hanoi(int n, char a, char b, char c, int& step) {
if (n == 1) {
cout << ++step << ": " << a << " -> " << c << endl;
return;
}
hanoi(n - 1, a, c, b, step);
cout << ++step << ": " << a << " -> " << c << endl;
hanoi(n - 1, b, a, c, step);
}
int main() {
int n; // 汉诺塔层数
cout << "请输入汉诺塔的层数:";
cin >> n;
int step = 0; // 步数
hanoi(n, 'A', 'B', 'C', step);
return 0;
}
```
在这个代码中,我们在 `hanoi` 函数中增加了一个 `step` 参数,用来记录移动的步数。在移动第 `n` 层盘子时,我们先递归地将前 `n-1` 层盘子从第一个柱子移动到第二个柱子上,再将第 `n` 层盘子从第一个柱子移动到第三个柱子上,并输出当前的步数和移动的起始柱子及目的柱子。最后再递归地将前 `n-1` 层盘子从第二个柱子移动到第三个柱子上。
在 `main` 函数中,我们先让用户输入汉诺塔的层数,然后调用 `hanoi` 函数进行移动,并记录每一步操作的步数和起始柱子及目的柱子,并按照要求输出。
用c++写出汉诺塔问题的程序设计
以下是用C语言写的汉诺塔问题程序设计:
```c
#include <stdio.h>
void hanoi(int n, char from, char to, char via) {
if (n == 1) {
printf("Move disk %d from %c to %c\n", n, from, to);
} else {
hanoi(n - 1, from, via, to);
printf("Move disk %d from %c to %c\n", n, from, to);
hanoi(n - 1, via, to, from);
}
}
int main() {
int n;
printf("Enter the number of disks: ");
scanf("%d", &n);
printf("Solution for %d disks:\n", n);
hanoi(n, 'A', 'C', 'B');
return 0;
}
```
在这个程序中,我们定义了一个递归函数 `hanoi` 来解决汉诺塔问题。该函数具有三个参数: `n` 表示要移动的盘子数, `from` 表示源柱子, `to` 表示目标柱子, `via` 表示辅助柱子。
如果 `n == 1`,我们只需将最后一个盘子从源柱子移动到目标柱子上。
否则,我们需要先将前 `n - 1` 个盘子从源柱子移动到辅助柱子上,然后将最后一个盘子从源柱子移动到目标柱子上,最后将前 `n - 1` 个盘子从辅助柱子移动到目标柱子上。
在 `main` 函数中,我们首先要求用户输入盘子数,然后调用 `hanoi` 函数来解决问题。我们将源柱子标记为 `A`,目标柱子标记为 `C`,辅助柱子标记为 `B`。