#include <cstdio>
#include <cstring>
const int mod = 100000000;
int st[1<<13]; // 存没有相邻1的每一行的状态
int map[1<<13]; //给出地的状态 (贫瘠土地标记为1)
int dp[13][1<<13]; //表示第i行状态为j时可以放牛的种数
bool judge1(int x) //判断x对应二进制有没有相邻的1
{
return (x&(x<<1)); //判断一个数相邻两位是不是同时为1,假如同时为 1 则返回一个值,否则返回 0 ,这样
}
bool judge2(int i,int x)
{
return (map[i]&st[x]); // 两个数的二进制对应位都是1时这位才得1否则是0。
}
int main()
{
int n,m,x;
while(~scanf("%d%d",&n,&m))
{
memset(st,0,sizeof(st));
memset(map,0,sizeof(map));
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++){
scanf("%d",&x);
if(x==0)
map[i]+=(1<<(j-1)); //给出地的状态 (贫瘠土地标记为1)
}
}
int k=0;
for(int i=0;i<(1<<m);i++)//枚举每一种状态
{
if(!judge1(i)) // 存没有相邻1的每一行的可能状态
st[k++]=i;
}
for(int i=0;i<k;i++)
{
if(!judge2(1,i)) //如果给出地的贫瘠状态与该情况下列举状态的每个1对应,那无法放置
dp[1][i]=1;
}
for(int i=2;i<=n;i++)
{
for(int j=0;j<k;j++)
{
if(judge2(i,j)) //判断第i行 假如按状态j放牛的话行不行。
continue; //不能放,所以继续
for(int f=0;f<k;f++)
{
if(judge2(i-1,f)) //剪枝 判断上一行与其状态是否满足
continue;
if(!(st[j]&st[f]))
dp[i][j]+=dp[i-1][f];
}
}
}
int ans=0;
for(int i=0;i<k;i++)
{
ans+=dp[n][i];
ans%=mod;
}
printf("%d\n",ans);
}
return 0;
}
#include <cstring>
const int mod = 100000000;
int st[1<<13]; // 存没有相邻1的每一行的状态
int map[1<<13]; //给出地的状态 (贫瘠土地标记为1)
int dp[13][1<<13]; //表示第i行状态为j时可以放牛的种数
bool judge1(int x) //判断x对应二进制有没有相邻的1
{
return (x&(x<<1)); //判断一个数相邻两位是不是同时为1,假如同时为 1 则返回一个值,否则返回 0 ,这样
}
bool judge2(int i,int x)
{
return (map[i]&st[x]); // 两个数的二进制对应位都是1时这位才得1否则是0。
}
int main()
{
int n,m,x;
while(~scanf("%d%d",&n,&m))
{
memset(st,0,sizeof(st));
memset(map,0,sizeof(map));
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++){
scanf("%d",&x);
if(x==0)
map[i]+=(1<<(j-1)); //给出地的状态 (贫瘠土地标记为1)
}
}
int k=0;
for(int i=0;i<(1<<m);i++)//枚举每一种状态
{
if(!judge1(i)) // 存没有相邻1的每一行的可能状态
st[k++]=i;
}
for(int i=0;i<k;i++)
{
if(!judge2(1,i)) //如果给出地的贫瘠状态与该情况下列举状态的每个1对应,那无法放置
dp[1][i]=1;
}
for(int i=2;i<=n;i++)
{
for(int j=0;j<k;j++)
{
if(judge2(i,j)) //判断第i行 假如按状态j放牛的话行不行。
continue; //不能放,所以继续
for(int f=0;f<k;f++)
{
if(judge2(i-1,f)) //剪枝 判断上一行与其状态是否满足
continue;
if(!(st[j]&st[f]))
dp[i][j]+=dp[i-1][f];
}
}
}
int ans=0;
for(int i=0;i<k;i++)
{
ans+=dp[n][i];
ans%=mod;
}
printf("%d\n",ans);
}
return 0;
}