题意: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;
}