思路: 汉诺塔游戏是经典的递归问题。游戏规则为将一堆盘子从起始柱子移动到目标柱子,每次只能移动一个盘子,且大盘子不能放在小盘子上面。我们可以利用递归来解决这个问题,将其分解为三个步骤:将上面的 n-1 个盘子从起始柱子移动到辅助柱子,将最底下的一个盘子从起始柱子移动到目标柱子,再将 n-1 个盘子从辅助柱子移动到目标柱子。重复这三个步骤,直到所有盘子都移动到目标柱子上。

代码如下:

#include <stdio.h>

// 定义函数move,将编号为n的盘子从起始柱子移动到目标柱子
void move(int n, char start, char target) {
    printf("Move disk %d from %c to %c\n", n, start, target);
}

// 定义函数hanoi,将n个盘子从起始柱子移动到目标柱子,辅助柱子为auxiliary
void hanoi(int n, char start, char target, char auxiliary) {
    if (n == 1) {
        // 只有一个盘子时,直接将盘子从起始柱子移动到目标柱子
        move(n, start, target);
    } else {
        // 将上面的 n-1 个盘子从起始柱子移动到辅助柱子
        hanoi(n-1, start, auxiliary, target);
        // 将最底下的一个盘子从起始柱子移动到目标柱子
        move(n, start, target);
        // 将 n-1 个盘子从辅助柱子移动到目标柱子
        hanoi(n-1, auxiliary, target, start);
    }
}

int main() {
    int n;
    printf("Enter the number of disks: ");
    scanf("%d", &n);

    hanoi(n, 'A', 'C', 'B'); // 将n个盘子从起始柱子A移动到目标柱子C,辅助柱子为B

    return 0;
}

代码解释:

  1. 首先在主函数中输入要移动的盘子数量n。
  2. 调用hanoi函数,将n个盘子从起始柱子A移动到目标柱子C,辅助柱子为B。
  3. 在hanoi函数中,如果n等于1,直接将盘子从起始柱子移动到目标柱子,调用move函数。
  4. 如果n大于1,首先将上面的 n-1 个盘子从起始柱子移动到辅助柱子,调用hanoi函数。
  5. 然后将最底下的一个盘子从起始柱子移动到目标柱子,调用move函数。
  6. 最后将 n-1 个盘子从辅助柱子移动到目标柱子,调用hanoi函数。
  7. 重复上述步骤,直到所有盘子都移动到目标柱子上。

原文地址: https://www.cveoy.top/t/topic/jd0w 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录