汉诺塔(C语言)
在处理汉诺塔问题时,我们会利用递归的思想去解决它。
具体规则,相信大家都知道。
其实无论多少层的汉诺塔,都是利用一个规律来完成的,这个规律也是能演变成递归的子问题。
总共有三步:
- 将n-1个汉诺塔盘,借助C柱从A柱移动到B柱。
- 将A柱上的一个汉诺塔盘移动到C柱上。
- 最后将B柱上的n-1个汉诺塔盘通过A柱移动到C柱上。
不难发现,移动n-1个汉诺塔盘就是移动n个汉诺塔盘的子问题,所以是将n拆成了两个n-1的子问题,n-1继续拆成俩个n-2的子问题,直到n==1时递归开始返回。
所以代码如下:
#include<stdio.h>
void move(char x, char y)
{
printf("%c移动到%c\n", x, y);
}
void hannuota(int n, char one,char two,char three)
{
if (n == 1)
move(one, three);
else
{
hannuota(n - 1, one, three, two);
move(one, three);
hannuota(n - 1, two, one, three);
}
}
int main()
{
printf("请输入汉诺塔数: ");
int n = 0;
scanf("%d", &n);
char a = 'A'; char b = 'B'; char c = 'C';
hannuota(n, a, b, c);
return 0;
}