poj3254 Corn fields

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

 

  

 

posted @ 2020-09-12 18:02  coastal_taipan  阅读(192)  评论(0编辑  收藏  举报