用1代表已经占有,0无被占有。
先预处理出所有横放的状态。
i-1行是0的地方肯定要放竖条。
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
#define LL __int64
int n,m;
int s[1<<12],cnt;
LL dp[12][1<<12];
int judge(int x)
{
int num=0;
for(int i=0;i<m;i++)
{
if(x&(1<<i))
num++;
else
{
if(num&1)
return 0;
num=0;
}
}
if(num&1)
return 0;
return 1;
}
void init()
{
cnt=0;
for(int i=0;i<(1<<m);i++)
if(judge(i))
s[cnt++]=i;
}
int main()
{
while(cin>>n>>m&&n+m)
{
init();
memset(dp,0,sizeof(dp));
for(int i=0;i<cnt;i++)
dp[0][s[i]]=1;
for(int r=1;r<n;r++)
{
for(int i=0;i<(1<<m);i++)
{
if(dp[r-1][i]==0)continue;
int tmp=((1<<m)-1)^i;
for(int j=0;j<cnt;j++)
{
if(s[j]&tmp)continue;
dp[r][tmp|s[j]]+=dp[r-1][i];
}
}
}
cout<<dp[n-1][(1<<m)-1]<<endl;
}
return 0;
}