比那个炮兵阵地的题简单点,数据也比较小,可以直接水掉。我在代码中运用了位运算来简化操作。
#include<cstdio>
#include<cstring>
#include<iostream>
#define N 13
#define MOD 100000000
#define INF 0x3f3f3f3f
using namespace std;
int r,c,tot;
int arr[N],suo[400];
long long dp[13][400];
bool ok(int x)//判断这种状态是否符合没有相邻的cow
{
if(x&(x<<1)) return false;
return true;
}
int main(void)
{
cin>>r>>c;
for(int i=1;i<=r;++i)
{
arr[i] = 0;
for(int j=1;j<=c;++j)
{
int a;
cin>>a;
arr[i] *= 2;
if(a==0)
{
arr[i] += 1;
}
}
}
int e = 1<<c;
tot = 0;
for(int i=0;i<e;++i)
{
if(ok(i))
suo[++tot] = i;
}
memset(dp,0,sizeof(dp));
for(int j=1;j<=tot;++j)
{
if((suo[j]&arr[1])==0)
dp[1][j] += 1;
}
for(int i=2;i<=r;++i)
for(int j=1;j<=tot;++j)
{
for(int e=1;e<=tot;++e)
{
if(((suo[j]&suo[e])==0)&&((suo[j]&arr[i])==0))//上面的没有相邻的cow,和此处放cow的地方不能为不肥沃的。
{
dp[i][j] = (dp[i][j]+dp[i-1][e])%MOD ;
}
}
}
long long ans = 0;
for(int j=1;j<=tot;++j)
ans = (ans + dp[r][j])%MOD;
cout<<ans<<endl;
return 0;
}