骨牌铺方格
骨牌铺方格
在1×n的一个长方形方格中,用1×1、1×2、1×3的骨牌铺满方格,输入n ,输出铺放方案的总数。 例如n=3时,为1× 3方格,骨牌的铺放方案有四种,如下图:

Sample Input
1 2 3 0
Sample Output
1 2 4
解析:这道题和拼图http://www.cnblogs.com/jiangjun/archive/2012/08/17/2644895.html大同小异,但这道题如果用DFS会超时,代码如下;
【解法一】DFS,会超时
# include<stdio.h> int d[3]={1,2,3}; int n,cnt; void DFS(int index) { int i; if(index>n)return; if(index==n) { cnt++; return; } for(i=0;i<=2;i++) DFS(index+d[i]); } int main() { while(scanf("%d",&n)&&n) { cnt=0; DFS(0); printf("%d\n",cnt); } return 0; }
【解法二】也是用同样的方法,找规律;f[i]表示在1Xn中铺排方案
f[1]=1;f[2]=2;f[3]=4;f[4]=7;f[5]=13```
可以看出:f[i]=f[i-1]+f[i-2]+f[i-3];代码有:
# include<stdio.h> int main() { int n,num,i; int a[1005]; while(scanf("%d",&n)&&n) { a[1]=1; a[2]=2; a[3]=4 for(i=4;i<=n;i++) { a[i]=a[i-1]+a[i-2]+a[i-3]; } printf("%d\n",a[n]); } return 0; }
由于数组存储的数目和长度都有限,那么可以用辗转迭代,作如下优化:
# include<stdio.h> int main() { int n,num,i; int a1,a2,a3; while(scanf("%d",&n)&&n) { a1=1; a2=2; a3=4; if(n<=2) { printf("%d\n",n); continue; } for(i=4;i<=n;i++) { num=a3; a3=a1+a2+a3; a1=a2; a2=num; } printf("%d\n",a3); } return 0; }
浙公网安备 33010602011771号