思路: 将汉诺塔问题分解为三个子问题:

  1. 将n-1个盘子从A经过C移动到B;
  2. 将第n个盘子从A移动到C;
  3. 将n-1个盘子从B经过A移动到C。

代码解释:

#include <stdio.h>

// 定义移动函数,参数为盘子个数n、起始柱子from、辅助柱子aux、目标柱子to
void move(int n, char from, char aux, char to) {
    // 当只有一个盘子时,直接将盘子从起始柱子移动到目标柱子
    if (n == 1) {
        printf("Move disk 1 from %c to %c\n", from, to);
        return;
    }
    // 递归调用move函数,将n-1个盘子从起始柱子经过目标柱子移动到辅助柱子
    move(n - 1, from, to, aux);
    // 将第n个盘子从起始柱子移动到目标柱子
    printf("Move disk %d from %c to %c\n", n, from, to);
    // 递归调用move函数,将n-1个盘子从辅助柱子经过起始柱子移动到目标柱子
    move(n - 1, aux, from, to);
}

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

    printf("Steps to solve the Tower of Hanoi problem:\n");
    move(n, 'A', 'B', 'C');

    return 0;
}

代码逐行解释:

  1. #include <stdio.h>:包含输入输出函数的标准库头文件。
  2. void move(int n, char from, char aux, char to) {:定义一个名为move的函数,参数为盘子个数n、起始柱子from、辅助柱子aux、目标柱子to。
  3. if (n == 1) {:判断当只有一个盘子时,执行下面的代码块。
  4. printf("Move disk 1 from %c to %c\n", from, to);:打印移动盘子的步骤,输出起始柱子和目标柱子的名称。
  5. return;:结束函数的执行。
  6. move(n - 1, from, to, aux);:递归调用move函数,将n-1个盘子从起始柱子经过目标柱子移动到辅助柱子。
  7. printf("Move disk %d from %c to %c\n", n, from, to);:打印移动盘子的步骤,输出起始柱子和目标柱子的名称。
  8. move(n - 1, aux, from, to);:递归调用move函数,将n-1个盘子从辅助柱子经过起始柱子移动到目标柱子。
  9. int main() {:程序的主函数。
  10. int n;:定义一个变量n,用于存储盘子的个数。
  11. printf("Enter the number of disks: ");:打印提示信息,要求输入盘子的个数。
  12. scanf("%d", &n);:从标准输入读取盘子的个数,并赋值给变量n。
  13. printf("Steps to solve the Tower of Hanoi problem:\n");:打印提示信息,用于展示解决汉诺塔问题的步骤。
  14. move(n, 'A', 'B', 'C');:调用move函数,传入盘子个数n和三个柱子的名称。
  15. return 0;:程序正常结束。
c语言汉诺塔要求代码逐行解释并且在做题之前说明思路通俗易懂

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

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