思路
代碼
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <vector>
using namespace std;
const int N = 14, M = 1 << 12, mod = 1e8;
int f[N][M];
vector<int> h[M];
vector<int> state;
int g[N];
int n, m;
bool check(int x)
{
for(int i = 0; i < m - 1; i++)
if((x >> i & 1) && (x >> i + 1 & 1))
return false;
return true;
}
int main()
{
cin >> n >> m;
for(int i = 1; i <= n; i++)
for(int j = 0; j < m; j++)
{
int t;
cin >> t;
g[i] += !t << j;
}
for(int i = 0; i < 1 << m; i++)
if(check(i))
state.push_back(i);
for(int i = 0; i < state.size(); i++)
for(int j = 0; j < state.size(); j++)
{
int a = state[i];
int b = state[j];
if((a & b) == 0)
{
h[i].push_back(j);
}
}
f[0][0] = 1;
for(int i = 1; i <= n + 1; i++)
for(int j = 0; j < state.size(); j++)
{
int a = state[j];
if(a & g[i]) continue;
for(int k = 0; k < h[j].size(); k++)
{
int b = h[j][k];
f[i][j] += f[i - 1][b];
f[i][j] %= mod;
}
}
cout << f[n + 1][0] << endl;
return 0;
}