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; }

浙公网安备 33010602011771号