问题描述![](https://img-blog.csdn.net/20140318200540718?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb3BlbmhmYw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
1. 将A上的盘子按顺序移动到C上
2. 任何移动结果保证大盘在下小盘在上
问题分析
n: 从上到下编号1...n
1. n = 1 A-->C
2. n = 2 A-->B, A-->C, B-->C
3. 定义 hanoi(盘数, 源柱子, 辅助柱, 目标柱) 为对应盘数的汉诺塔操作
对于任意盘数, 我们将它分为如下两部分 1, 2
则对于第 1 部分我们使用 hanoi() 做 A-->B 的移动(辅助移动)
对于第 2 部分移动为 A-->C
最后使用 hanoi() 对第 1 部分做 B-->C的移动
对与第 1 部分我们的源塔为 A, 目标塔为 B, 辅助塔为 C,
因为任何移动结果都有大盘在下, 小盘在上的约定, 所以在每次移动中, 任何一个塔都可以作为辅助塔
则第 1 部分的 A-->B 移动为 hanoi(n-1, A, C, B)
同理第一部分从 B-->C 的移动为 hanoi(n-1, B, A, C)
此时 源塔为 B, 目标塔为 C, 辅助塔为 A
代码
#include <stdio.h>
void hanoi(int amount, char pag_src, char pag_aux, char pag_des) {
// 递归结束条件, 基本移动
if (amount == 1) {
printf("将第 %d 个盘子从 %c 移动到 %c\n", amount, pag_src, pag_des);
} else {
hanoi(amount-1, pag_src, pag_des, pag_aux);
printf("将第 %d 个盘子从 %c 移动到 %c\n", amount, pag_src, pag_des);
hanoi(amount-1, pag_aux, pag_src, pag_des);
}
}
int main() {
int amount;
printf("请输入盘数: ");
scanf("%d", &amount);
hanoi(amount, 'A', 'B', 'C');
return 0;
}