汉诺塔问题
1,我们为了后期方便讲解首先进行一个简单的命名—— 起始柱:1; 过度柱: 2; 目标住:3;
2,由于汉诺塔问题是一个明显的递归问题,所以我们用递归的思想来解决它。
3,我们可以把n个盘子想成两个部分:第n个盘子和前n-1个盘子。要想把这n个盘子从1柱移动到3柱,首先需要把前n-1个盘子先移动到2柱上,接着将第n个盘子从1柱移动到三柱上。(注意:我们这里把前n-1个盘子看成一个整体。)
图解
我们以三个盘子做图解示例。
注释:1 by 2 to 3:起始柱为1柱,通过过度柱2,去目标住3.
代码
下面我们用代码实现这个过程。
下面展示一些 内联代码片
。
// void Hanoi(int n, int a, int b, int c)
{
static int flag = 0;
if (n > 1)
{
Hanoi(n - 1, a, c, b);
printf("第%d次:%d to %d\n",++flag, a, c);
Hanoi(n - 1, b, a, c);
}
else
printf("第%d次:%d to %d\n",++flag, a, c);
}
int main()
{
int n = 0;
int a = 0;
int b = 0;
int c = 0;
printf("几个盘子 起始柱 过度柱 目标住\n");
scanf("%d %d %d %d", &n,&a,&b,&c);
Hanoi(n, a, b, c);
return 0;
}
制作不易,如果对你有帮助,点个赞,留下你的关注吧。