2290. 玉米田

题目描述

农民 John 购买了一处肥沃的矩形牧场,分成M*N(1 <= M <= 12; 1 <= N <= 12)个格子。他想在那里的一些格子中种植美味的玉米。遗憾的是,有些格子区域的土地是贫瘠的,不能耕种。精明的 FJ 知道奶牛们进食时不喜欢和别的牛相邻,所以一旦在一个格子中种植玉米,那么他就不会在相邻的格子中种植,即没有两个被选中的格子拥有公共边。他还没有最终确定哪些格子要选择种植玉米。    作为一个思想开明的人,农民 John 希望考虑所有可行的选择格子种植方案。由于太开明,他还考虑一个格子都不选择的种植方案!请帮助农民 John 确定种植方案总数。

输入

Line 1: 两个用空格分隔的整数 M 和 N
Lines 2…M+1: 第 i+1 行描述牧场第i行每个格子的情况, N 个用空格分隔的整数,表示 这个格子是否可以种植(1 表示肥沃的、适合种植,0 表示贫瘠的、不可种植)

输出

Line 1: 一个整数: FJ 可选择的方案总数 除以 100,000,000 的余数。

Code

#include
#include
#define mod 1e8
using namespace std;
int f,n,m,ans,dp[13][1 << 13];
char BB[1 << 15],*S = BB,*T = BB;
char c;
bool a[13][13];
inline void dfs(const int st,const int x,const int y,const int ct,const int e)
{
	if(ct == m + 1)
	if(x == n)
	{
		ans += dp[x][y];
		ans %= mod;
		return;
	}
	else
	{
		dp[x+1][st]+=dp[x][y];dp[x+1][st]%=mod;
		return;
	}
	if(a[x][ct]&&!(y&(1<<(~-ct)))&&!e) dfs(st|1<<(~-ct),x,y,ct+1,1);
	dfs(st,x,y,ct+1,0);
	return;
}
int main()
{
	//freopen("cowfood.in","r",stdin);
	//freopen("cowfood.out","w",stdout);
	cin >> n >> m;
	for(int i = 1;i <= n;i++)
	 	for(int j = 1;j <= m;j++) 
	 		cin >> a[i][j];
	dp[0][0] = 1;
	for(int i = 0;i <= n;i++)
	 	for(int j = 0;j < (1 << m);j++) 
	 		if(dp[i][j]) 
	 			dfs(0,i,j,1,0);
	cout << ans;
}

你可能感兴趣的:(信息学)