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

  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/fvAg 著作权归作者所有。请勿转载和采集!

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