题目链接:https://vjudge.net/problem/POJ-3254
题意:m*n矩阵,为1可以放牛,牛可以放任意只,要求没有两只在的格子有相邻的边,求总方案数
设f[i][j]表示考虑到第i行,列的放置情况为状态s,则f[i][s]=Σf[i-1][s'],直接暴力枚举状态s和s'即可。需要满足状态s和s'都合法(本身所在的行里,牛都放在有1的位置而且不共享相同的边),而且s和s'兼容(s和s'不共享相同的边)
#include<iostream>
using namespace std;
const int mod=1e8;
int a[20][20],f[20][(1<<15)],m,n,i,j,s1,s2;
int main(){
cin>>m>>n;
for (i=1;i<=m;i++)
for (j=0;j<n;j++) cin>>a[i][j];
for (i=1;i<=m;i++)
for (s1=0;s1<(1<<n);s1++){
int b=0; int c[20]={0};
for (j=0;j<n;j++) c[j]=(s1>>j)&1;
for (j=0;j<n;j++)
if ((c[j]&c[j+1])||(c[j]==1&&a[i][j]==0)) b=1;
if (b) continue;
if (s1>0) f[i][s1]=1;
for (s2=0;s2<(1<<n);s2++)
if ((s1&s2)==0) f[i][s1]=(f[i][s1]+f[i-1][s2])%mod;
}
int ans=0;
for (i=0;i<(1<<n);i++) ans=(ans+f[m][i])%mod;
cout<<ans+1<<endl;
return 0;
}