今天看了3个这种题了 枚举第一行即可
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<cmath> 6 #include<queue> 7 #include<stack> 8 #include<vector> 9 #include<map> 10 #include<string> 11 #define maxn 12 #define INF 13 using namespace std; 14 typedef long long LL; 15 int n,m,flag; 16 17 int num1[21][21],num2[21][21]; 18 int get_sum(int i,int j) 19 { 20 int tem=num2[i][j]; 21 if(i>0) 22 tem+=num2[i-1][j]; 23 if(j<m-1) 24 tem+=num2[i][j+1]; 25 if(j>0) 26 tem+=num2[i][j-1]; 27 return tem; 28 } 29 int check(int x) 30 { 31 int ans=num2[0][x]; 32 if (x) 33 ans+=num2[0][x-1]; 34 if (x<m-1) 35 ans+=num2[0][x+1]; 36 if (ans==num1[0][x] || ans+1==num1[0][x]) 37 return true; 38 return false; 39 } 40 int puan(int s) 41 { 42 for(int j=0;j<m;j++) 43 { 44 if((s&(1<<j))) 45 num2[0][j]=1; 46 else 47 num2[0][j]=0; 48 } 49 if(n==1) 50 { 51 for(int i=0;i<m;i++) 52 if(get_sum(0,i)!=num1[0][i]) 53 return 0; 54 return 1; 55 } 56 for(int i=0;i<m;i++) 57 { 58 if(!check(i)) 59 return 0; 60 } 61 for(int i=1;i<n;i++) 62 for(int j=0;j<m;j++) 63 { 64 if(get_sum(i-1,j)==num1[i-1][j]) 65 num2[i][j]=0; 66 else if(get_sum(i-1,j)+1==num1[i-1][j]) 67 num2[i][j]=1; 68 else 69 return 0; 70 71 } 72 for(int i=0;i<m;i++) 73 if(get_sum(n-1,i)!=num1[n-1][i]) 74 return 0; 75 return 1; 76 } 77 int main() 78 { 79 80 char str[30]; 81 int t; 82 while(scanf("%d",&t)!=EOF) 83 { 84 for(int ii=1; ii<=t; ii++) 85 { 86 scanf("%d%d",&n,&m); 87 for(int i=0; i<n; i++) 88 { 89 scanf("%s",str); 90 for(int j=0; j<m; j++) 91 num1[i][j]=str[j]-'0'; 92 } 93 94 for(int i=0; i<(1<<m); i++) 95 { 96 if(puan(i)) 97 break; 98 } 99 printf("Case %d: ",ii); 100 for(int i=0; i<n; i++) 101 { 102 for(int j=0; j<m; j++) 103 { 104 if(num2[i][j]) 105 printf("*"); 106 else 107 printf("."); 108 } 109 printf(" "); 110 } 111 } 112 } 113 114 return 0; 115 }