定义函数解决汉诺塔问题:将A柱上的盘子通过B柱移动到C柱子,在main函数中输入汉诺塔盘子数n,输出移动路径。输出格式:"%c->%c " c语言代码
时间: 2024-01-22 19:17:52 浏览: 28
以下是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语言 要求由用户输入盘子数和柱子名称
好的,以下是汉诺塔的 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` 函数来解决问题。
汉诺塔四根柱子c语言代码详解
以下是汉诺塔四根柱子的 C 语言代码实现,注释详细说明了每一步的操作:
```c
#include <stdio.h>
void hanoi(int n, int a, int b, int c, int d) {
if (n == 1) { // 当只有一个盘子时,直接移动到目标柱子上
printf("Move disk %d from rod %d to rod %d\n", n, a, d);
return;
}
hanoi(n-2, a, d, c, b); // 递归地将前 n-2 个盘子从起始柱子移动到目标柱子的辅助柱子上
printf("Move disk %d from rod %d to rod %d\n", n-1, a, c); // 将第 n-1 个盘子从起始柱子移动到中间柱子上
printf("Move disk %d from rod %d to rod %d\n", n, a, d); // 将第 n 个盘子从起始柱子移动到目标柱子上
printf("Move disk %d from rod %d to rod %d\n", n-1, c, d); // 将第 n-1 个盘子从中间柱子移动到目标柱子上
hanoi(n-2, b, a, c, d); // 递归地将前 n-2 个盘子从辅助柱子移动到目标柱子上
}
int main() {
int n = 4; // 盘子的数量
hanoi(n, 1, 2, 3, 4); // 调用 hanoi 函数进行汉诺塔问题的求解
return 0;
}
```
在这个实现中,我们使用了递归的方式来解决汉诺塔问题。在每次递归中,我们将前 n-2 个盘子从起始柱子移动到目标柱子的辅助柱子上,然后将第 n-1 个盘子从起始柱子移动到中间柱子上,再将第 n 个盘子从起始柱子移动到目标柱子上,最后将第 n-1 个盘子从中间柱子移动到目标柱子上,最终完成了汉诺塔问题的求解。
需要注意的是,在这个实现中,我们使用了 1、2、3、4 四个数字来代表四根柱子,其中 1 代表起始柱子,2 和 4 代表辅助柱子,3 代表目标柱子。