二刷提高课,题解目录在这里— 提高课的题解目录
此题和上一题大同小异
注意这里也需要预处理,因为 121<<121<<12 并且还需要判断土地是否可种可能会超时
#include<iostream>
#include<vector>
using namespace std;
const int N=14,M=1<<N,mod=1e8;
int g[N];
vector<int >mp[M];
int f[N][M];
int n,m;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
int x;
cin>>x;
g[i]=(g[i]<<1)+x;
}
}
for(int i=0;i<1<<m;i++)
{
if((i&(i<<1))==0)
{
for(int j=0;j<1<<m;j++)
{
if(((j&(j<<1))==0)&&((i&j)==0))
mp[i].push_back(j);
}
}
}
f[0][0]=1;
for(int i=1;i<=n+1;i++)
{
for(int j=0;j<1<<m;j++)
{
if((j&(j<<1))==0&&((j&~g[i])==0))
{
for(auto x:mp[j])
{
if((x&j)==0&&((x&~g[i-1])==0))
{
f[i][j]=(f[i][j]+f[i-1][x])%mod;
}
}
}
}
}
cout<<f[n+1][0];
return 0;
}