1、汉诺塔问题:有一座宝塔(塔A),其上有64个金碟,所有碟子按从大到小由塔底堆放至塔顶。紧挨着这座宝塔有另外的两座宝塔(塔B和塔C),要求塔A上的碟子移动到塔C上去,其间可以借助于塔B。每次只能移动一个碟子,任何时候都不能把一个碟子放在比它小的碟子上面。请写出完整c语言代码
时间: 2023-03-14 19:00:06 浏览: 75
#include<stdio.h>
void move(int n,char from,char to,char helper)
{
if(n==1){
printf("Move disk %d from %c to %c\n",n,from,to);
return;
}
move(n-1,from,helper,to);
printf("Move disk %d from %c to %c\n",n,from,to);
move(n-1,helper,to,from);
}
int main()
{
int n=64;
move(n,'A','C','B');
return 0;
}
相关问题
1、汉诺塔问题:有一座宝塔(塔A),其上有64个金碟,所有碟子按从小到大由塔底堆放至塔顶。紧挨着这座宝塔有另外的两座宝塔(塔B和塔C),要求塔A上的碟子移动到塔C上去,其间可以借助于塔B。每次只能移动一个碟子,任何时候都不能把一个碟子放在比它小的碟子上面。请写出c语言代码
### 回答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上。
运行以上代码,即可看到每一步的移动过程输出。
用python解决汉诺塔问题:有三个柱子a,b,c。若a柱子上有若干碟子,每次移动一块碟子,小的只能叠在大的上面,把所有碟子从a移动到c柱子上
可以使用递归来解决汉诺塔问题,以下是示例代码:
```python
def hanoi(n, a, b, c):
if n > 0:
hanoi(n-1, a, c, b)
print("Move disk %d from %s to %s" % (n, a, c))
hanoi(n-1, b, a, c)
# 测试
hanoi(3, 'A', 'B', 'C')
```
输出结果为:
```
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
```
解释:
- `n` 表示当前移动的盘子数;
- `a`、`b`、`c` 分别表示三个柱子;
- 第一步递归调用 `hanoi(n-1, a, c, b)`,将 `n-1` 个盘子从 `a` 移动到 `b`;
- 第二步输出将第 `n` 个盘子从 `a` 移动到 `c`;
- 第三步递归调用 `hanoi(n-1, b, a, c)`,将 `n-1` 个盘子从 `b` 移动到 `c`。