请给我一个c语言计算汉诺塔问题的代码
时间: 2023-08-31 21:32:13 浏览: 108
C语言汉诺塔问题代码
5星 · 资源好评率100%
### 回答1:
#include <stdio.h>
int main()
{
int n;
printf("请输入需要移动的盘子数量:");
scanf("%d", &n);
hanoi(n, 'A', 'B', 'C');
return 0;
}
void hanoi(int n, char from, char to, char depend)
{
if (n == 1)
{
printf("从%c移动到%c\n", from, to);
}
else
{
hanoi(n-1, from, depend, to); // 将n-1个盘子从A移动到C
printf("从%c移动到%c\n", from, to);
hanoi(n-1, depend, to, from); // 将n-1个盘子从C移动到B
}
}
### 回答2:
下面是一个用C语言编写的计算汉诺塔问题的代码:
```c
#include <stdio.h>
// 定义递归函数,n表示盘子的个数,A、B、C代表三个柱子
void hanoi(int n, char A, char B, char C) {
if (n == 1) { // 如果只有一个盘子,则直接将它从A柱子移动到C柱子
printf("将盘子从 %c 移动到 %c\n", A, C);
} else {
hanoi(n-1, A, C, B); // 将n-1个盘子从A柱子借助C柱子移动到B柱子
printf("将盘子从 %c 移动到 %c\n", A, C); // 将最大的盘子从A柱子移动到C柱子
hanoi(n-1, B, A, C); // 将n-1个盘子从B柱子借助A柱子移动到C柱子
}
}
int main() {
int n;
printf("请输入盘子的个数:");
scanf("%d", &n);
hanoi(n, 'A', 'B', 'C'); // 调用hanoi函数计算并打印出移动步骤
return 0;
}
```
运行代码时输入所需盘子的个数,程序将输出在移动过程中每个步骤的操作,将盘子从柱子A移动到柱子C,满足汉诺塔规则。
### 回答3:
下面是一个使用C语言编写的计算汉诺塔问题的递归代码:
```c
#include <stdio.h>
// 声明递归函数
void hanoiTower(int n, char from_rod, char to_rod, char aux_rod)
{
if (n == 1) // 如果只有一个盘子
{
printf("移动盘子 1 从 %c 到 %c\n", from_rod, to_rod);
return;
}
//调用递归函数
hanoiTower(n - 1, from_rod, aux_rod, to_rod); // 从起始柱移动前 n - 1 个盘子到辅助柱
printf("移动盘子 %d 从 %c 到 %c\n", n, from_rod, to_rod); // 移动最底下的盘子到目标柱
hanoiTower(n - 1, aux_rod, to_rod, from_rod); // 从辅助柱移动前 n - 1 个盘子到目标柱
}
int main()
{
int n = 3; // 汉诺塔的层数
hanoiTower(n, 'A', 'C', 'B'); // 调用函数开始移动
return 0;
}
```
这个代码用递归的方式解决汉诺塔问题。函数`hanoiTower`接受4个参数:`n`表示汉诺塔的层数,`from_rod`表示起始柱,`to_rod`表示目标柱,`aux_rod`表示辅助柱。
主函数中调用`hanoiTower`函数,将汉诺塔问题的层数设为3,起始柱设为A,目标柱设为C,辅助柱设为B。
在递归函数中,如果只有一个盘子,则直接从起始柱移动到目标柱。否则,先将 n-1 个盘子从起始柱移动到辅助柱,然后再将最底下的盘子从起始柱移动到目标柱,最后将 n-1 个盘子从辅助柱移动到目标柱。递归函数会不断调用自身,直到问题被解决完毕。
阅读全文