代码如下:
#include<iostream>
#include<cstring>
using std::cin;
using std::cout;
#define N 13
#define mod 100000000
#define reint register int
int n,m,num,fields[N],f[N][1<<N],status[1<<N],ans;
inline bool checks(int x)
{
if(x&(x<<1)||x&(x>>1))return false;
return true;
}
inline bool grows(int a,int b)//a 该行土地情况 b 目前种植状态
{
while(a&&b)
{
if((!(a&1))&&(b&1))return false;
a>>=1;b>>=1;
}
return true;
}
inline void starts()
{
memset(fields,0,sizeof(fields));
memset(f,0,sizeof(f));
memset(status,0,sizeof(status));
}
int main()
{
std::ios::sync_with_stdio(false);
cin>>n>>m;
starts();
for(reint i=1;i<=n;++i)
for(reint j=1;j<=m;++j)
{
bool g;
cin>>g;
fields[i]+=(g<<(m-j));
}
int full=(1<<n)-1;
for(reint i=0;i<=full;++i)
if(checks(i))status[++num]=i;
for(reint i=1;i<=num;++i)//边界条件
{
if(!grows(fields[1],status[i]))continue;
f[1][status[i]]=1;
}
for(reint i=2;i<=n;++i)
for(reint j=1;j<=num;++j)
for(reint h=1;h<=num;++h)//上一行方案数
{
int x=status[j],y=status[h];
if(!grows(fields[i],x)||(x&y))continue;
f[i][x]+=f[i-1][y];
}
for(reint i=1;i<=num;++i)ans+=f[n][status[i]];
cout<<ans<<'\n';
return 0;
}
求解