汉诺塔递归算法思路:
1. 如果只有一个盘子,那么直接从柱子1移动到柱子3
2. 如果有 >1 个盘子,那么先把 n-1 个盘子从柱子1移动到柱子2 (想要让最底下一个移动到从柱子1移动到柱子3,一定会有这一步骤,就是除了最底下的那个柱子,其他都按照顺序排列在柱子2中) 再把第n个盘子从柱子1移动到柱子3,最后再把n-1个盘子从柱子2移动到柱子3
ount = 1;
void han(int n,char* a,char* b,char* c)
{
if (n == 1)
{
printf("%d:%s -> %s\n", count, a, c); // 当n==1的时候,直接从柱子1移动到柱子3
count++;
}
else
{
han(n - 1, a, c, b);// 第一步需要把 n-1 个盘子从 柱子1 借助 柱子3 移动到 柱子2
printf("%d:%s -> %s\n", count, a, c);// 第二步把 柱子1 剩下的最大的那个从 柱子1 移动到 柱子3
count++;
han(n - 1, b, a, c); // 第三步把 柱子2 中的 n-1 个盘子从 柱子2 借助 柱子1 移动到 柱子3
}
}
int main()
{
int n = 0;
printf("请输入汉诺塔的盘子数:");
scanf("%d", &n);
han(n, "柱1", "柱2", "柱3");
return 0;
}