杭电2077

哎,说实话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;
 }

 

posted on 2012-10-23 21:22  @ 小浩  阅读(313)  评论(0编辑  收藏  举报