poj 2411

题意:1*2的砖块填满n*m的地板

思路:i行j列由i-1行j列推得,i-1行j列处竖放得到或i行横放得到;枚举i行横放的方法数和i-1行的状态数;

#include<cstdio>
#include<cstring>
long long f[30][1<<12],i,j,height,width,saya=1;
void sayatime(int i,int s1,int pos)//行数,第i行已填格数,状态
{
    if(pos==width) {f[i][s1]+=saya;return;}
    sayatime(i,s1,pos+1);
    if(pos<=width-2&&!(s1&1<<pos)&&!(s1&1<<pos+1))//pos未越界且后面有两个空格
        sayatime(i,s1|1<<pos|1<<pos+1,pos+2);//行数,第i行已填格子数,状态
}
int main()
{
    while(scanf("%d%d",&height,&width))
    {
        if(height==0&&width==0) break;
        memset(f,0,sizeof(f));
        saya=1;
        sayatime(1,0,0);
        for(i=2;i<=height;i++)
        {
            for(j=0;j<1<<width;j++)
            {
                if(f[i-1][j]) saya=f[i-1][j];
                else continue;
                sayatime(i,~j&((1<<width)-1),0);
            }
        }
        printf("%lld\n",f[height][(1<<width)-1]);
    }
    return 0;
}


©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页