萌新求助0分代码
/*****************************************
备注:
******************************************/
#include <queue>
#include <math.h>
#include <stack>
#include <stdio.h>
#include <iostream>
#include <vector>
#include <iomanip>
#include <string.h>
#include <algorithm>
using namespace std;
#define LL long long
const int N = 1e5 + 10;
const int INF = 1e0;
int n , m ,len;
int a[N];
int dp[15][1000];
int can[N];
bool flag(int s)
{
if(s & (s << 1)) return false;
return true;
}
void init()
{
for(int i = 0 ; i < (1 << m) ; i++)
if(flag(i))
can[len++] = i;
}
int main()
{
cin >> n >> m;
init();
for(int i = 1 ; i <= n ; i++)
{
for(int j = m-1 , l =0 ; l < m ; j-- , l++)
{
int x;
cin>>x;
if(!x)
continue;
a[i] += pow(2,l);
}
}
int maxx = 0;
for(int i = 0 ; i < len ; i++) // 第一个
if((can[i] & a[1]) == can[i])
for(int j = 0 ; j < len ; j++)
{
dp[1][i] = 1;
}
for(int k = 3 ; k <= n ; k++)
{
for(int i = 0 ; i < len ; i++) // 当前
{
if((can[i] & a[k]) != can[i]) continue;
for(int j = 0 ; j < len ; j++) // 上一个
{
if(can[i] & can[j]) continue;
for(int l = 0 ; l < len ; l++) // 上上一个
{
if(can[i] & can[l]) continue;
dp[k][i] = (dp[k][i] , dp[k-1][j])%INF;
}
}
}
}
int sum=0;
for(int i=1;i<len;i++)
sum=(sum+dp[n][i])%INF;
cout<<sum<<endl;
return 0;
}