如何用C语言实现经典的汉诺塔问题算法?
时间: 2024-09-18 21:03:06 浏览: 68
汉诺塔是一个经典的递归问题,它涉及到三个柱子A、B和C,以及一堆大小为n的圆盘。目标是从柱子A将所有圆盘移动到柱子C,但每次只能移动一个圆盘,并且任何时候都不得有比较小的圆盘更大的圆盘在上面。
以下是C语言实现汉诺塔问题的基本步骤:
```c
void hanoi(int n, char from_rod, char to_rod, char aux_rod) {
if (n > 0) {
// 递归地移动小盘子
hanoi(n - 1, from_rod, aux_rod, to_rod);
// 移动最大的盘子
printf("Move disk %d from rod %c to rod %c\n", n, from_rod, to_rod);
// 再次递归地移动剩余的小盘子
hanoi(n - 1, aux_rod, to_rod, from_rod);
}
}
int main() {
int num_disks = 3; // 可以根据需要更改圆盘的数量
hanoi(num_disks, 'A', 'C', 'B'); // A是起始柱子,C是目标柱子,B是辅助柱子
return 0;
}
```
在这个代码里,`hanoi`函数就是递归的核心部分,每次调用都会缩小问题规模,直到只剩下一个圆盘,这时可以直接从源移到目标,然后回溯到处理剩余的圆盘。
相关问题
c语言重述解决汉诺塔问题的算法,汉诺塔问题的程序实现(hanoi塔)
汉诺塔问题是一个经典的递归问题,其算法描述如下:
1. 将n-1个盘子从起始柱移动到过渡柱
2. 将第n个盘子从起始柱移动到目标柱
3. 将n-1个盘子从过渡柱移动到目标柱
C语言下,汉诺塔问题的程序实现如下:
```c
#include <stdio.h>
void Hanoi(int n, char a, char b, char c) {
if (n == 1) {
printf("Move disk %d from %c to %c\n", n, a, c);
} else {
Hanoi(n-1, a, c, b);
printf("Move disk %d from %c to %c\n", n, a, c);
Hanoi(n-1, b, a, c);
}
}
int main() {
int n;
printf("Enter the number of disks: ");
scanf("%d", &n);
Hanoi(n, 'A', 'B', 'C');
return 0;
}
```
在此代码中,`Hanoi`函数接收四个参数,分别为盘子的数量`n`,起始柱`a`,过渡柱`b`,目标柱`c`。当`n`为1时,直接将盘子从起始柱移动到目标柱。当`n`大于1时,先将n-1个盘子从起始柱移动到过渡柱,再将第n个盘子从起始柱移动到目标柱,最后将n-1个盘子从过渡柱移动到目标柱。在`main`函数中,通过用户输入盘子的数量,调用`Hanoi`函数求解汉诺塔问题。
c语言重述解决汉诺塔问题的算法,汉诺塔问题高精度的程序实现
汉诺塔问题的递归算法可以描述为:
1. 如果只有一个盘子,直接将其从A柱移动到C柱。
2. 如果有n(n>1)个盘子,将它们分成两部分:最底下的一个盘子和其余的盘子,假设底下的盘子在A柱,其余盘子在B柱。
3. 将B柱上的n-1个盘子移动到C柱(递归调用)。
4. 将A柱上的一个盘子移动到C柱。
5. 将B柱上的n-1个盘子移动到A柱(递归调用)。
以下是 C 语言中使用递归实现汉诺塔问题的代码:
```c
#include <stdio.h>
void hanoi(int n, char A, char B, char C) {
if(n == 1) {
printf("Move disk 1 from %c to %c\n", A, C);
return;
}
hanoi(n - 1, A, C, B);
printf("Move disk %d from %c to %c\n", n, A, C);
hanoi(n - 1, B, A, C);
}
int main() {
int n;
printf("Enter the number of disks: ");
scanf("%d", &n);
hanoi(n, 'A', 'B', 'C');
return 0;
}
```
对于高精度的实现,我们可以使用数组来存储数字的每一位。以下是 C 语言中使用高精度实现汉诺塔问题的代码:
```c
#include <stdio.h>
#include <string.h>
#define MAXN 1000
struct bign {
int d[MAXN], len;
bign() {
memset(d, 0, sizeof(d));
len = 0;
}
};
bign change(char str[]) {
bign a;
a.len = strlen(str);
for(int i = 0; i < a.len; i++) {
a.d[i] = str[a.len - i - 1] - '0';
}
return a;
}
bign add(bign a, bign b) {
bign c;
int carry = 0;
for(int i = 0; i < a.len || i < b.len; i++) {
int sum = a.d[i] + b.d[i] + carry;
c.d[c.len++] = sum % 10;
carry = sum / 10;
}
if(carry != 0) {
c.d[c.len++] = carry;
}
return c;
}
void print(bign a) {
for(int i = a.len - 1; i >= 0; i--) {
printf("%d", a.d[i]);
}
printf("\n");
}
void hanoi(bign n, char A, char B, char C) {
if(n.len == 1 && n.d[0] == 1) {
printf("Move disk 1 from %c to %c\n", A, C);
return;
}
bign m, k;
m = change("1");
for(int i = 1; i < n.len; i++) {
m = add(m, m);
}
if(n.d[n.len - 1] % 2 == 0) {
hanoi(m, A, C, B);
print(m);
k = add(m, m);
print(k);
hanoi(add(n, k.d[0]), A, B, C);
} else {
hanoi(n, A, C, B);
k = add(m, m);
hanoi(add(n, k.d[0]), C, B, A);
}
}
int main() {
char str[MAXN];
printf("Enter the number of disks: ");
scanf("%s", str);
bign n = change(str);
hanoi(n, 'A', 'B', 'C');
return 0;
}
```
在这个实现中,我们定义了一个结构体 bign 来存储高精度数字,其中 d 数组存储数字的每一位,len 表示数字的位数。我们使用 change 函数将字符串转换为 bign 类型。add 函数实现了高精度加法。print 函数用于输出 bign 类型的数字。在 hanoi 函数中,我们使用一个 bign 类型的变量 m 来存储 2 的 n - 1 次方,其中 n 是当前处理的数字的位数。如果当前处理的数字的最后一位是偶数,我们先将 n - 1 个盘子从 A 移到 B,再将最后一个盘子从 A 移到 C,最后将 n - 1 个盘子从 B 移到 C。如果当前处理的数字的最后一位是奇数,我们先将 n - 1 个盘子从 A 移到 C,再将最后一个盘子从 A 移到 B,最后将 n - 1 个盘子从 C 移到 B。
阅读全文
相关推荐
![-](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![txt](https://img-home.csdnimg.cn/images/20241231045021.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![pptx](https://img-home.csdnimg.cn/images/20241231044947.png)