记f[i][s]为第i行种草状态为s的方案数
对于读入,我们要先处理出来每行的可行方案去一行一行推!
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;
const int mod=1e8;
struct point
{
int st[1005],cnt;
}e[17];
int f[17][1005];
int in[17];
int main()
{
// freopen("field.in","r",stdin);
// freopen("field.out","w",stdout);
scanf("%d%d",&n,&m);
int x,s;
for(int i=1;i<=n;i++)
{
s=0;
for(int j=1;j<=m;j++)
{
scanf("%d",&x);
s=(s<<1)+1-x;
}
in[i]=s;
}
for(int k=1;k<=n;k++)
for(int i=0;i<(1<<m);i++)
if((i&(i<<1))||(i&(i>>1))||(i&in[k])) continue;
else e[k].st[++e[k].cnt]=i;
for(int i=1;i<=e[1].cnt;i++)
f[1][i]=1;
for(int i=2;i<=n;i++)
for(int j=1;j<=e[i].cnt;j++)
{
f[i][j]=0;
for(int k=1;k<=e[i-1].cnt;k++)
{
if(e[i].st[j]&e[i-1].st[k]) continue;
f[i][j]+=f[i-1][k];
}
}
long long ans=0;
for(int i=1;i<=e[n].cnt;i++)
ans=(ans+f[n][i])%mod;
printf("%lld",ans);
return 0;
}