c语言汉诺塔要求代码逐行解释并且在做题之前说明思路通俗易懂
思路: 将汉诺塔问题分解为三个子问题:
- 将n-1个盘子从A经过C移动到B;
- 将第n个盘子从A移动到C;
- 将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;
}
代码逐行解释:
#include <stdio.h>:包含输入输出函数的标准库头文件。void move(int n, char from, char aux, char to) {:定义一个名为move的函数,参数为盘子个数n、起始柱子from、辅助柱子aux、目标柱子to。if (n == 1) {:判断当只有一个盘子时,执行下面的代码块。printf("Move disk 1 from %c to %c\n", from, to);:打印移动盘子的步骤,输出起始柱子和目标柱子的名称。return;:结束函数的执行。move(n - 1, from, to, aux);:递归调用move函数,将n-1个盘子从起始柱子经过目标柱子移动到辅助柱子。printf("Move disk %d from %c to %c\n", n, from, to);:打印移动盘子的步骤,输出起始柱子和目标柱子的名称。move(n - 1, aux, from, to);:递归调用move函数,将n-1个盘子从辅助柱子经过起始柱子移动到目标柱子。int main() {:程序的主函数。int n;:定义一个变量n,用于存储盘子的个数。printf("Enter the number of disks: ");:打印提示信息,要求输入盘子的个数。scanf("%d", &n);:从标准输入读取盘子的个数,并赋值给变量n。printf("Steps to solve the Tower of Hanoi problem:\n");:打印提示信息,用于展示解决汉诺塔问题的步骤。move(n, 'A', 'B', 'C');:调用move函数,传入盘子个数n和三个柱子的名称。return 0;:程序正常结束。
原文地址: https://www.cveoy.top/t/topic/jdY5 著作权归作者所有。请勿转载和采集!