拼图
拼图
Description
给你1x2、2x1和2x2,3种矩形若干,请你计算出把它们放入2xn的矩形中,一共有多少方法?

Sample Input
3 4
Sample Output
5 11
【解法一】
//DFS思想
# include<stdio.h> # include<string.h> int dir1[2][2]={{0,1},{1,0}}; int vis[2][30]; int cnt,ms,st,en; int n; int judge() { int i,j,leap=0; for(i=0;i<2;i++) { for(j=0;j<n;j++) { if(vis[i][j]==0) { st=i; en=j; leap=1; break; } } if(leap==1)break; } return leap; } void dfs(int x,int y,int s) { int tx,ty,i; if(judge())//找出最近的空缺位置 { x=st; y=en; for(i=0;i<2;i++) { tx=x+dir1[i][0]; ty=y+dir1[i][1]; if(tx>=0&&tx<2&&ty>=0&&ty<n&&!vis[x][y]&&!vis[tx][ty])//填1x2和2x1图片时的搜索 { if(s==ms-2) { cnt++; continue; } vis[x][y]=1; vis[tx][ty]=1; dfs(tx,ty,s+2); vis[x][y]=0; vis[tx][ty]=0; } } tx=x+1; ty=y+1; if(tx>=0&&tx<2&&ty>=0&&ty<n&&!vis[x][y]&&!vis[tx][ty]&&!vis[tx][y]&&!vis[x][ty])//填2x2图片时的搜索 { if(s==ms-4) { cnt++; return; } vis[x][y]=1; vis[tx][ty]=1; vis[tx][y]=1; vis[x][ty]=1; dfs(tx,ty,s+4); vis[x][y]=0; vis[tx][ty]=0; vis[tx][y]=0; vis[x][ty]=0; } } } int main() { while(scanf("%d",&n)!=EOF) { cnt=0; ms=2*n; memset(vis,0,sizeof(vis));//开始vis开大了,一直超时 ds(0,0,0); printf("%d\n",cnt); } return 0; }
【解法二】
//现在想一想,x轴一直都为2。如果放2x1,在y轴就占据了一个单位的位置;如果放1x2,就占据了两个单位的位置;放2x2也是两个
//那么如果确定放哪个,这样的空间位置内,一定就是放的它自身,如图Figure2;
//那么DFS就精简如下
# include<stdio.h> int n,num; int b[3]={1,2,2}; void dfs(int index)//只考虑横向(y轴) { int i; if(index>n) return; if(index==n) { num++; return; } for(i=0;i<=2;i++) { dfs(index+b[i]); } } int main() { while(scanf("%d",&n)!=EOF) { num=0; dfs(0); printf("%d\n",num); } return 0; }
【解法三】
//还有一种更绝的方法,从数据中找规律
//能得到f(n)=2*f(n-2)+f(n-1);
# include<stdio.h> int f(int n) { if(n==1)return 1; if(n==2)return 3; return 2*f(n-2)+f(n-1); } int main() { int n; while(scanf("%d",&n)!=EOF) { printf("%d\n",f(n)); } return 0; }
浙公网安备 33010602011771号