时间限制: 1000ms 内存限制: 1024MB
描述
有一个方格矩阵,矩阵边界在无穷远处。我们做如下假设: a. 每走一步时,只能从当前方格移动一格,走到某个相邻的方格上; b. 走过的格子立即塌陷无法再走第二次; c. 只能向北、东、西三个方向走; 请问:如果允许在方格矩阵上走n步,共有多少种不同的方案。2种走法只要有一步不一样,即被认为是不同的方案。
输入
允许在方格上行走的步数n
输出
计算出的方案数量
对于小数据1 <= n <= 20; 对于大数据1 <= n <= 100.
-
样例输入
-
2
样例输出
-
7
#include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<iostream> #include<cmath> #include<algorithm> #include<string> #include<vector> #include<map> #include<set> #include<queue> #define pb push_back #define mp make_pair #define x first #define y second using namespace std; struct big { int s[50],size; big operator+(const big &b) { int i; big c;memset(c.s,0,sizeof(c.s));c.size=0; for(i=0;i<size||i<b.size;i++) { c.s[i]+=s[i]+b.s[i]; if(c.s[i]>9) c.s[i]-=10,c.s[i+1]++; } c.size=max(size,b.size); if(c.s[c.size])c.size++; return c; } void pri() { int i; for(i=size-1;i>=0;i--) printf("%d",s[i]); } }; big f[102][3]; int main() { int n; scanf("%d",&n); int i; f[0][0].s[0]=1; f[0][0].size=1; for(i=1;i<=n;i++) { f[i][1]=f[i-1][1]+f[i-1][0]; f[i][2]=f[i-1][2]+f[i-1][0]; f[i][0]=f[i-1][0]+f[i-1][1]+f[i-1][2]; } big ans=f[n][0]+f[n][1]+f[n][2]; ans.pri(); }