POJ 3254 Corn Fields
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 using namespace std; 5 #define N 15 6 #define mod 100000000 7 8 int map[N][N],map_num[N],dp[N][1<<N]; 9 10 bool check_raw(int num)//判断同一行上是否合法,如10110则不合法 11 { 12 for(int i=1; i<num; i<<=1 )//一位一位判断,每合法一位则左移一位 13 { 14 if((num & i) != 0 && (num & (i<<1)) != 0) 15 return false; 16 } 17 return true; 18 } 19 20 bool check_line (int a,int b)//判断同一列上是否合法 21 { 22 if((a & b)==0) 23 return true; 24 else 25 return false; 26 } 27 28 bool check_map(int num , int mp_num)//判断是否种在肥沃土地上 29 /* 30 1010110 31 0010100 32 则合法 33 */ 34 { 35 if((num & mp_num)==num) 36 return true ; 37 else 38 return false; 39 } 40 41 int main() 42 { 43 int n,m; 44 while(~scanf("%d%d", &n,&m)) 45 { 46 for(int i=0; i<n; i++) 47 { 48 int sum = 0; 49 int k = m-1; 50 for(int j=0; j<m; j++) 51 { 52 scanf("%d",&map[i][j]); 53 sum += map[i][j] * (1<<k); 54 k--; 55 } 56 map_num[i] = sum;//每行的和 57 } 58 59 int len = 1 << m; 60 memset(dp,0,sizeof(dp)); 61 62 for(int j=0; j<len; j++) 63 { 64 if(check_raw(j) && check_map(j,map_num[0])) 65 dp[0][j] = 1; 66 } 67 68 for(int i=1; i<n; i++) 69 { 70 for(int j=0; j<len; j++) 71 { 72 for(int k=0; k<len; k++) 73 { 74 if(dp[i-1][k] && check_raw(j) && check_map(j,map_num[i]) && check_line(j,k)) 75 { 76 dp[i][j] += dp[i-1][k]; 77 dp[i][j] %= mod; 78 } 79 } 80 } 81 } 82 int ans =0 ; 83 for(int j=0; j<len; j++) 84 { 85 ans += dp[n-1][j]; 86 ans %= mod; 87 } 88 printf("%d\n",ans); 89 } 90 return 0; 91 }