哎,说实话Hanio塔这样的题,要是思路不对,真是干着急啊!就是无法ac,哎!
对了,此题的解题思路可以参考杭电2064,依然是递推的问题!!
对比杭电2064,此题附加了一个规则,就是允许最大的一个盘子放到其他盘子的的上面,
首先这样考虑:
1)把最左边的1号杆上的n-1个盘子移到2号中间的杆上; //移动次数f(n-1)
2)把最左边第n个盘子(即最大的盘子从1号移动到2号,再从2号移动到3号);//移动次数2
3)再把2号杆上的n-1个盘子移动到3号杆上;//移动次数f(n-1);
总的移动次数等于f(n-1)+f(n-1)+2=2*f(n-1)+2;
接着,对于n前面的n-1个盘子的移动就符合以前的规律了,例如将n-2个盘子
首先按规则从1号盘移动到2号盘,在移动到3号盘,此时将第n-1号盘从1号杆子上移动到2好杆子上 这样
就完成了把n-1个盘子从一号杆子移动到2号杆子上的任务。
移动次数=3*f(n-1)+1;其余的以此类推!!
说到这里了,你可以ac了吗?呵呵呵!!!
***对于递归调用的简单讲解请参考本人的:
http://www.cnblogs.com/xiohao/archive/2012/10/15/2724965.html
#include<iostream>
using namespace std;
int main()
{
int T,n;
int f(int m);
cin>>T;
getchar();
while(T--)
{
cin>>n;
if(n==1)
cout<<2<<endl;
else
printf("%d\n",2*f(n-1)+2);
}
return 0;
}
int f(int m)
{
if(m==1)
return 1;
else
return 3*f(m-1)+1;
}