题目链接: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; }