HDU 2064(递推&递归_E题)解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2064

-----------------------------------------------------------------------------------

题意:汉诺塔,但是要求是:不能从左边(右边)直接移动到右边(左边),必须经过中间柱子,其余要求与经典汉诺塔相同。

思路:递归,找规律,只有一个圆盘时,步骤为2,当有k个圆盘时,将其看作k-1个圆盘和1个圆盘两部分,首先将k-1移动到最右端f(k-1)次,最大圆盘移动到中间,然后k-1移动到最左端f(k-1),最大圆盘移动到最右端,最后,k-1移动到最右端。由此得到递推公式:f(k)=3*f(k-1)+2;

注意:尽量不要使用pow()函数,返回是浮点数,有截尾误差。

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);
const double eps = 1e-6;


int main(void){
    int N=0;
    while(~scanf("%d",&N)){
        //ll ans =pow(3,N)-1; pow返回是浮点数 有误差 
        ll t =1;
        for(int i=0;i<N;i++){
            t*=3;
        }
        ll ans =t-1;
        printf("%lld\n",ans);
    }

    return 0;

}
View Code

 

posted @ 2018-01-25 16:54  caomp  阅读(127)  评论(0)    收藏  举报