POJ - 3254
农场主John新买了一块长方形的新牧场,这块牧场被划分成M行N列(1 ≤ M ≤ 12; 1 ≤ N ≤ 12),每一格都是一块正方形的土地。John打算在牧场上的某几格里种上美味的草,供他的奶牛们享用。
遗憾的是,有些土地相当贫瘠,不能用来种草。并且,奶牛们喜欢独占一块草地的感觉,于是John不会选择两块相邻的土地,也就是说,没有哪两块草地有公共边。
John想知道,如果不考虑草地的总块数,那么,一共有多少种种植方案可供他选择?(当然,把新牧场完全荒废也是一种方案)
输入输出格式
输入格式:
第一行:两个整数M和N,用空格隔开。
第2到第M+1行:每行包含N个用空格隔开的整数,描述了每块土地的状态。第i+1行描述了第i行的土地,所有整数均为0或1,是1的话,表示这块土地足够肥沃,0则表示这块土地不适合种草。
输出格式:
一个整数,即牧场分配总方案数除以100,000,000的余数。
铭记:用位运算符一定要加(),其优先级较低。
#include<iostream>
using namespace std;
const int maxn=13,mod=1e8;
int mp[maxn];//每行用二进制数字记录方格信息
int dp[maxn][1<<maxn];//记录 到某一行的时候 对应选取的方法数
bool judge[1<<maxn]; //记录1的相邻位没有1的二进制数。
int main()
{
int m,n;
cin>>m>>n;int tmp;
for(int j=1;j<=m;j++)
{
for(int i=1;i<=n;i++)
{
cin>>tmp;
mp[j]=(mp[j]<<1)+tmp;
}
}
int end=1<<n;
for(int j=0;j<end;j++)
{
if