为什么不对啊
by KevinYu @ 2018-11-22 21:06:50
```
#include<cstdio>
#include<cstdlib>
using namespace std;
const int M = 1e9;
int m, n, f[13][4096], F[13], grassl[13][13];
bool state[4096];//状态是否合法
// max state: (11111111111)2 = (4095)10
int main()
{
scanf("%d%d",&m,&n);
for (int i = 1; i <= m; i++)
for (int j = 1; j <= n; j++)
{
scanf("%d",&grassl[i][j]);
F[i] = (F[i] << 1) + grassl[i][j];//第i行转换为二进制存储于F[i]
}
const int MAX = 1 << n;
for (int i = 0; i < MAX; i++)
state[i] = ((i&(i<<1))==0) && ((i&(i>>1))==0);//不能两头牛的草地是相邻的 二进制状态是否合法
f[0][0] = 1;//荒废牧场
for (int i = 1; i <= m; i++)
for (int j = 0; j < MAX; j++)
if (state[j] && ((j & F[i]) == j))//j状态合法 且 有牛的地方都有草
for (int k = 0; k < MAX; k++)
if ((k & j) == 0)//上下没有相邻牛
f[i][j] = (f[i][j] + f[i-1][k]) % M;
int ans = 0;
for (int i = 0; i < MAX; i++)//最后一行的和
ans += f[m][i], ans %= M;
printf("%d",ans);
return 0;
}
```
by Freddie @ 2018-12-01 09:42:10