对于n个圆盘,进行一轮如下操作:
0.视上面n-1个圆盘为一个整体
1.将该整体移动到这样一个柱上:非最终目标柱 && 非该整体当前所在柱
2.将最底下的那个圆盘移动到最终目标柱上
3.将该整体移动到最终目标柱上
对于以上的1.3.操作中的任何一个,如果该次操作的整体,圆盘数量不为1
则直接先对该整体再进行一轮操作
如果该次操作的整体,圆盘数量为1,则该次操作正常结束,不用再执行
代码实现:
#include <stdio.h>
int f(int l, int r)
//l是该轮操作最上面圆盘的序号,r是最下面的
//想求较大圆盘数的操作次数,要用long long或更高精度
{
if (l == r)//l==r说明该次移动只有一个圆盘
{
if (!l)//l==0,说明只需要移动最上面的圆盘,直接返回1
return 1;
else//l!=0,说明该轮操作需要移动该轮最下面的圆盘到目标柱上,这是一次操作 > 1
//然后再把之前视为整体的n-1个圆盘整体移动到刚才那个圆盘上 > f(0,r-1)
return 1 + f(0, r - 1);
}
else//l!=r,说明该轮操作有多个圆盘,将它们分成两部分 > f(l,r-1) 和 f(r,r)
//前者是n-1的那个整体,后者是该轮最底下那个圆盘
return f(l, r - 1) + f(r, r);
}
int main()
{
int n;
scanf("%d", &n);
printf("%d", f(0, n - 1));
return 0;
}