定义函数解决汉诺塔问题:将A柱上的盘子通过B柱移动到C柱子,在main函数中输入汉诺塔盘子数n,输出移动路径。输出格式:"%c->%c " c语言代码
时间: 2024-01-22 09:17:52 浏览: 75
以下是C语言代码:
```c
#include <stdio.h>
void hanoi(int n, char A, char B, char C) {
if (n == 1) {
printf("%c->%c ", A, C);
} else {
hanoi(n - 1, A, C, B);
hanoi(1, A, B, C);
hanoi(n - 1, B, A, C);
}
}
int main() {
int n;
printf("请输入汉诺塔盘子数n:");
scanf("%d", &n);
printf("移动路径为:");
hanoi(n, 'A', 'B', 'C');
printf("\n");
return 0;
}
```
函数 `hanoi` 是递归实现汉诺塔问题的函数,参数 `n` 表示要移动的盘子数,参数 `A`、`B`、`C` 分别表示三个柱子。当 `n` 等于 1 时,直接将盘子从 A 柱移动到 C 柱;否则,先将 `n-1` 个盘子从 A 柱通过 C 柱移动到 B 柱,再将最后一个盘子从 A 柱移动到 C 柱,最后将 B 柱上的 `n-1` 个盘子通过 A 柱移动到 C 柱。主函数中先输入盘子数 `n`,然后调用 `hanoi` 函数输出移动路径。
相关问题
用C++实现这个问题:有三个柱子A、B和C,A柱子上从上到下放有n个盘子,盘子大小不同,下面盘子的直径比上面盘子的直径更大。现在要将A柱子上所有的盘子移动到C柱子上,移动过程中可以借助B柱子,但需要满足以下三个规则: 每次只能移动一个盘子; 盘子可以放在空柱子上,也可以放在比自己直径更大的盘子上; 在任意时刻,大盘子必须在下面,小盘子必须在上面。 提示:你可以使用递归算法来解决汉诺塔问题。 编写两个函数 void move(int n,char s,char d);//用来输出移动信息,n为盘子编号,s为移动起点,d为移动终点 void hanoi(int n,char s,char m,char d);//将n个盘子从s借助m移动到d
好的,以下是对应的C++代码实现:
```cpp
#include <iostream>
using namespace std;
// 定义move函数,用于输出移动信息
void move(int n, char s, char d) {
cout << "Move disk " << n << " from " << s << " to " << d << endl;
}
// 定义hanoi函数,用于将n个盘子从s柱子借助m柱子移动到d柱子
void hanoi(int n, char s, char m, char d) {
if (n == 1) {
// 只有一个盘子时,直接从s移动到d
move(n, s, d);
} else {
// 将n-1个盘子从s借助d移动到m
hanoi(n-1, s, d, m);
// 将第n个盘子从s移动到d
move(n, s, d);
// 将n-1个盘子从m借助s移动到d
hanoi(n-1, m, s, d);
}
}
int main() {
hanoi(3, 'A', 'B', 'C');
return 0;
}
```
输出结果如下:
```
Move disk 1 from A to C
Move disk 2 from A to B
Move disk 1 from C to B
Move disk 3 from A to C
Move disk 1 from B to A
Move disk 2 from B to C
Move disk 1 from A to C
```
这个代码的时间复杂度是O(2^n),因为对于每个盘子,都需要进行一次移动操作。但是由于汉诺塔问题的特殊性质,可以证明其时间复杂度是最优的。
汉诺塔c语言 要求由用户输入盘子数和柱子名称
好的,以下是汉诺塔的 C 语言代码,可以由用户输入盘子数和柱子名称:
```c
#include <stdio.h>
void hanoi(int n, char from, char to, char via) {
if (n == 1) {
printf("Move disk from %c to %c\n", from, to);
return;
}
hanoi(n-1, from, via, to);
printf("Move disk from %c to %c\n", from, to);
hanoi(n-1, via, to, from);
}
int main() {
int n;
char a, b, c;
printf("Enter the number of disks: ");
scanf("%d", &n);
printf("Enter the name of first pole: ");
scanf(" %c", &a);
printf("Enter the name of second pole: ");
scanf(" %c", &b);
printf("Enter the name of third pole: ");
scanf(" %c", &c);
hanoi(n, a, c, b);
return 0;
}
```
在这个程序中,我们使用递归来解决汉诺塔问题。`hanoi` 函数接受三个参数:盘子数量 `n`,起始柱子名称 `from`,目标柱子名称 `to`,以及中介柱子名称 `via`。如果只有一个盘子,我们直接将它从起始柱子移动到目标柱子。否则,我们将前 n-1 个盘子从起始柱子移动到中介柱子,然后将第 n 个盘子从起始柱子移动到目标柱子,最后将前 n-1 个盘子从中介柱子移动到目标柱子。
在 `main` 函数中,我们首先要求用户输入盘子数量和三个柱子的名称,然后调用 `hanoi` 函数来解决问题。
阅读全文