用c语言实现:有一座宝塔(塔A)上有 64 个金碟,所有碟子按从大到小的次序从塔底堆放至塔顶。紧挨着这座宝塔有另外两个宝塔(塔 B 和塔 C),要求把塔 A 上的碟子移动到塔 C 上去,其间借助于塔 B 的帮助。每次只能移动一个碟子,任何时候都不能把一个碟子放在比它小的碟子上面。
时间: 2024-10-08 18:24:35 浏览: 14
在C语言中实现这种问题,我们可以设计一个递归函数来模拟这个过程。假设`moveDisk`函数接受三个参数:源塔索引`src`, 目标塔索引`dest`, 当前处理的碟子编号`current`。由于题目规定不允许将较小的碟子放在上面,所以目标塔B在过程中起到临时存储的作用。
```c
#include <stdio.h>
// 模拟移动单个碟子
void moveDisk(int src, int dest, int current) {
printf("Move disk %d from tower %d to tower %d\n", current, src, dest);
}
// 递归函数,完成将第`current`层的碟子移到目标塔`dest`
void moveDisksFromTower(int src, int dest, int size) {
if (size > 0) { // 如果还有碟子需要移动
// 首先移动上一层的碟子到中间塔B
moveDisksFromTower(src, 2, size - 1);
// 然后将当前层的碟子直接移动到目标塔
moveDisk(src, dest, size);
// 最后把之前放到中间塔B的碟子移回原位置
moveDisk(2, dest, size - 1);
}
}
int main() {
int towers[] = {0, 1, 2}; // 宝塔数组表示分别为A、B、C
int numDisks = sizeof(towers)/sizeof(towers[0]) - 1; // 从大到小倒数第二个元素为64
printf("Moving disks from Tower A to Tower C...\n");
moveDisksFromTower(towers[0], towers[2], numDisks); // 开始移动
return 0;
}
```
当你运行这段程序时,它会按照规则依次打印出每一步的操作,直到所有的碟子都转移到塔C。
阅读全文