题目:http://poj.org/problem?id=3254
跟这题套路相似。。。hoj2662
代码:
注意不用第三维(题目要求输出所有情况和)
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int n,m,num=0;
int a[12+5];//每行的可放状态
int s[1<<12];
long long f[12+5][1<<12];
void dfs(int state,int col)
{
if (col>m)
{
num++;
s[num]=state;
return ;
}
dfs(state,col+1);
dfs(state+(1<<(col-1)),col+2);
}
int main()
{
int i,temp,x,j,k,l;
long long ans=0;
freopen("a.txt","r",stdin);
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++)
{
temp=0;
for (j=0;j<m;j++)
{
scanf("%d",&x);
temp+=((1-x)<<j);
}
a[i]=temp;
}
dfs(0,1);
for (i=1;i<=num;i++)
if ((s[i]&a[1])==0)
f[1][s[i]]=1;
for (i=2;i<=n;i++)
{
for (j=1;j<=num;j++)
{
if ((s[j]&a[i])>0)
continue;
for (k=1;k<=num;k++)
{
if ((s[j]&s[k])>0 || (s[k]&a[i-1])>0)
continue;
f[i][s[j]]+=f[i-1][s[k]];
f[i][s[j]]%=100000000;
}
}
}
for (i=1;i<=num;i++)
{
if ((s[i]&a[n])>0)
continue;
ans+=f[n][s[i]];
ans%=100000000;
}
printf("%d",ans);
return 0;
}