这是本文档旧的修订版!
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> using namespace std; int h,w; long long f[12][(1<<12)]; int read() { int x=0,f=1;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f; } int main() { h=read(),w=read(); while(h&&w) { if((h*w)%2){puts("0"),h=read(),w=read();continue;} memset(f,0,sizeof(f)); if(!h&&!w)break; for(int i=1;i<=h;i++) { for(int j=0;j<(1<<w);j++) { if(i==1) { f[i][j]=1; for(int l=1;l<(1<<w);l<<=1) { if((j&l)==0) { if((l<<1)>=(1<<w)){f[i][j]=0;break;} else if(j&(l<<1)){f[i][j]=0;break;} else l<<=1; } } } else { for(int k=0;k<(1<<w);k++) { if(!f[i-1][k])continue; f[i][j]+=f[i-1][k]; for(int l=1;l<(1<<w);l<<=1) { if(k&l) { if(j&l){f[i][j]-=f[i-1][k];break;} } else if((j&l)==0) { if((l<<1)>=(1<<w)){f[i][j]-=f[i-1][k];break;} else if(j&(l<<1)){f[i][j]-=f[i-1][k];break;} else if(k&(l<<1)){f[i][j]-=f[i-1][k];break;} else l<<=1; } } } } } } printf("%lld\n",f[h][0]); h=read(),w=read(); } return 0; }