炮兵阵地弱化版 没什么好说的= = 做完炮兵阵地这就一水题
#include<cstdio>
#include<algorithm>
#include<cstring>
const int MAXN = 10;
const int p = 100000000;
const int maxs = (1 << MAXN);
int Map[MAXN+10], ID[maxs+10], d[MAXN+10][maxs+10], idcnt;
int n, m;
bool ok(int x)
{
if(x & (x << 1)) return false;
return true;
}
int main()
{
while(scanf("%d%d", &n, &m) == 2 && n + m)
{
int S = 1 << m;
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
{
int x;
scanf("%d", &x);
if(!x) Map[i] |= (1 << j);
}
for(int i = 0; i < S; i++)
if(ok(i))
ID[idcnt++] = i;
for(int i = 0; i < idcnt; i++)
if(!(Map[0] & ID[i]))
d[0][i] = 1;
for(int row = 1; row < n; row++)
{
for(int i = 0; i < idcnt; i++)
{
if(Map[row] & ID[i]) continue;
d[row][i] = 0;
for(int j = 0; j < idcnt; j++)
{
if(ID[i] & ID[j]) continue;
if(Map[row-1] & ID[j]) continue;
d[row][i] = (d[row][i] + d[row-1][j]) % p;
}
}
}
int Ans = 0;
for(int i = 0; i < idcnt; i++)
Ans = (Ans + d[n-1][i]) % p;
printf("%d\n", Ans);
}
}