二进制枚举+状压dp
一开始我是没想到的 我还以为是搜索....
接受了社会的毒打后 发现看成状压dp还挺好写的
每一层的合法状态可由上一层的所有合法状态得到 而每一层哪些状态合法也是比较容易算出来的
代码有详细注释

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod = 1e8;
const int N = 13;
const int INF = 1e5;
ll n,m,a,dp[N][1<<N],s[N],t;
int main()
{
       ios::sync_with_stdio(false);
       while(cin>>n>>m)
       {
            for(int i=1;i<=n;++i)
            {
               for(int j=1;j<=m;++j)
               {
                   cin>>a;
                   s[i]=(s[i]<<1)+a;
               }
            }
            dp[0][0]=1;
            for(int i=1;i<=n;++i)
            {
               for(int j=0;j<1<<m;++j)
               {
                   if(j&(j>>1))continue;
                   if((j&s[i])!=j) continue;
                   for(int k=0;k<1<<m;++k)
                   {
                     if(k&j) continue;
                     dp[i][j]=(dp[i][j]+dp[i-1][k])%mod;
                   }
               }
            }
            ll ans=0;
            for(int i=0;i<1<<m;++i) ans=(ans+dp[n][i])%mod;
            cout<<ans<<endl;
            memset(dp,0,sizeof(dp));
       }

    return 0;
}