题目内容
大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?
问题1:先考虑若将A中圆盘全部移至C上,需要多少步?
思路:想将A的圆盘全部移动到C上,先考虑最大的圆盘,此时一定会出现如图的情况:A只有最大的圆盘,C上为空,B上有 n-1 个圆盘(且符合条件),此时将A移至C上,再将B全部移至C(相当于将 n-1个圆盘移至C盘)
可以得出关系式: F(n)=2*F(n-1)+1; F(1)=1 --> F(n)=2^n-1
问题2:输出移动圆盘操作的过程
思路:这个时候用递归的思想,将步骤拆成三个阶段
1. 将 A 中的前 n-1 个盘全部移至 B盘的操作
2. 将 A 中最底端的盘移至 C盘中的操作
3. 将 B 中全部的 n-1 个盘 全部移至 C中
结束条件:当只一个盘的时候,从当前盘的位置移至C盘
核心代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
int n,m;
int sum;
void move(int s,char a,char b,char c) // 一共s个盘 全部在a中,借助盘c将其全部移至b中
{ // 第一次 a:A b:C c:B
if(s==1)
{
printf("Step%d:%c->%c\n",++sum,a,b);
return ;
}
else
{
move(s-1,a,c,b); // 将 A(a) 的n-1个圆盘全部移至B(c)
printf("Step%d:%c->%c\n",++sum,a,b); // A(a)的最大盘 移至 C(b)
move(s-1,c,b,a); //再将 B(c) 中n-1个盘移至 C(b)
}
}
int main()
{
scanf("%d",&n);
move(n,'A','C','B');
system("pause");
return 0;
}
关于代码思路的理解:
递归的操作比较抽象,但调试的方法可以很好的理解,遇到每一种情况,都存在相应的步骤,使得圆盘按照规定的顺序移动,代码中的 a b c 参数 没有固定,可以从任意盘移到其他盘,若对递归还不是很熟悉,需要加深理解!