33,007
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <string.h>
long long s[14][14][5000];
int w,h;
int list[20],v[20];
void GetList(int step){
if (step>w){
int value1=0;
int value2=0;
int i;
for (i=1;i<=w;i++){
value1<<=1;
value2<<=1;
switch (list[i]){
case 0:
value1|=1;
break;
case 1:
value1|=1;
value2|=1;
break;
case 2:
value2|=1;
break;
}
}
if (h>1)
s[w][h][value2]+=s[w][h-1][value1];
else
s[w][h][value2]=1;
return;
}
if (h>1) list[step]=2,GetList(step+1);
if (step<w) list[step]=list[step+1]=1,GetList(step+2);
list[step]=0;
GetList(step+1);
}
int main(){
memset(s,0,sizeof s);
int i,j,k;
v[0]=1;
for (i=1;i<20;i++)
v[i]=v[i-1]<<1;
for (w=1;w<=12;w++)
for (h=1;h<=12;h++)
GetList(1);
for (scanf("%d%d",&w,&h);w;scanf("%d%d",&w,&h))
printf("%I64d\n",s[w][h][v[w]-1]);
}