每一行的状态压缩成一个整数在进行判断
s数组用来储存每一个合理状态
lend数组用来保存地的情况 注意不可以放的地方是置为1的
#include<cstdio>
#include<algorithm>
#include<cstring>
#define mod 1000000000
#define clr(a,b) memset(a,b,sizeof(a));
#include<iostream>
using namespace std;
int maxn=0;
int dp[20][1000];
int land[20];
int s[1000];
int m,n;
void init()
{
maxn=0;
for(int i=0;i<(1<<n);i++)
{
if((i&(i<<1))==0) s[++maxn]=i;
}
}
int main()
{
while(scanf("%d%d",&m,&n)!=EOF)
{
init();
//printf("%d\n",maxn);
clr(land,0)
clr(dp,0)
int temp=0;
//printf("stop");
for(int i=1;i<=m;i++)
{
//printf("stop");
for(int j=1;j<=n;j++)
{
scanf("%d",&temp);
if(temp==0) land[i]=land[i]|(1<<(n-j));
}
}
//cout<<land[1]<<land[2]<<endl;
for(int i=1;i<=maxn;i++)
{
if((land[1]&s[i])==0)
dp[1][i]=1;
}
for(int i=2;i<=m;i++)
{
for(int j=1;j<=maxn;j++)
{
if((land[i]&s[j])==0)
for(int k=1;k<=maxn;k++)
{
if((land[i-1]&s[k])==0&&(s[k]&s[j])==0)
dp[i][j]=(dp[i][j]+dp[i-1][k])%mod;
}
}
}
int ans=0;
for(int i=1;i<=maxn;i++)
{
ans=(ans+dp[m][i])%mod;
}
printf("%d\n",ans);
}
}