1、汉诺塔问题:有一座宝塔(塔A),其上有64个金碟,所有碟子按从小到大由塔底堆放至塔顶。紧挨着这座宝塔有另外的两座宝塔(塔B和塔C),要求塔A上的碟子移动到塔C上去,其间可以借助于塔B。每次只能移动一个碟子,任何时候都不能把一个碟子放在比它小的碟子上面。请写出c语言代码
时间: 2023-09-06 13:04:41 浏览: 220
### 回答1:
答:汉诺塔问题的C语言代码如下:
/* 声明函数hanoi,它有三个参数:
* 参数n:表示金碟的数量
* 参数from:表示移动的起始宝塔
* 参数to:表示移动的目标宝塔
*/
void hanoi(int n, char from, char to)
{
if(n == 1)
{
printf("从塔 %c 移动碟子 1 到塔 %c\n", from, to);
return;
}
else
{
char other;
/* 从from、to中找出另外一个宝塔 */
if(from == 'A' && to == 'C')
other = 'B';
else if(from == 'A' && to == 'B')
other = 'C';
else if(from == 'B' && to == 'C')
other = 'A'; /* 将n-1个碟子从from移动到other */
hanoi(n-1, from, other);
/* 将第n个碟子从from移动到to */
printf("从塔 %c 移动碟子 %d 到塔 %c\n", from, n, to);
/* 将n-1个碟子从other移动到to */
hanoi(n-1, other, to);
}
}
### 回答2:
最经典的汉诺塔问题采用递归的方式求解,下面是使用C语言实现的代码:
```c
#include <stdio.h>
void hanoi(int n, char A, char B, char C) {
if (n == 1) {
printf("将第1个盘子从 %c 移动到 %c\n", A, C);
} else {
hanoi(n-1, A, C, B);
printf("将第%d个盘子从 %c 移动到 %c\n", n, A, C);
hanoi(n-1, B, A, C);
}
}
int main() {
int n = 64; // 盘子的数量
hanoi(n, 'A', 'B', 'C');
return 0;
}
```
解释一下代码的逻辑:
- `hanoi` 函数负责移动盘子的逻辑。参数 `n` 表示当前要移动的盘子的数量,`A`、`B`、`C` 表示塔的名称。如果 `n` 等于 1,表示只有一个盘子,直接将盘子从 `A` 移动到 `C` 即可;否则,先将 `n-1` 个盘子从 `A` 移动到 `B`,再将最底下的第 `n` 个盘子从 `A` 移动到 `C`,最后将 `n-1` 个盘子从 `B` 移动到 `C`。
- `main` 函数中,将盘子数量设为64,然后调用 `hanoi` 函数开始移动盘子。
运行以上代码,将会输出移动盘子的步骤,每一行表示将第 x 个盘子从某个塔移动到另一个塔。
### 回答3:
以下是汉诺塔问题的C语言代码:
```c
#include <stdio.h>
void hanoi(int n, char A, char B, char C)
{
if (n == 1)
{
printf("将第%d个盘子从塔%c移动到塔%c\n", n, A, C);
}
else
{
hanoi(n - 1, A, C, B);
printf("将第%d个盘子从塔%c移动到塔%c\n", n, A, C);
hanoi(n - 1, B, A, C);
}
}
int main()
{
int num = 64;
hanoi(num, 'A', 'B', 'C');
return 0;
}
```
在上述代码中,`hanoi` 函数用于解决汉诺塔问题。`n` 表示当前需要移动的盘子数量,`A`、`B`、`C` 表示塔A、塔B和塔C的名称。
当只有一个盘子时(`n == 1`),直接将盘子从塔A移动到塔C。
当有多个盘子时,先将`n-1`个盘子从塔A通过借助塔C移动到塔B上,再将第`n`个盘子从塔A移动到塔C上,最后将塔B上的`n-1`个盘子借助塔A移动到塔C上。
在 `main` 函数中,将64个盘子从塔A移动到塔C上。
运行以上代码,即可看到每一步的移动过程输出。
阅读全文