骨牌铺方格

骨牌铺方格

 

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

 

 

Input

输入数据由多行组成,每行包含一个整数n,表示该测试实例的长方形方格的规格是1×n

 

Output

对于每个测试实例,请输出铺放方案的总数,每个实例的输出占一行。

 

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

 

 

 

posted on 2013-02-03 17:48  即为将军  阅读(2280)  评论(0)    收藏  举报

导航