sdust 2410 Mine Number

今天看了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:\n",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("\n");
110             }
111         }
112     }
113 
114     return 0;
115 }

 

posted on 2015-04-14 15:12  tsw123  阅读(130)  评论(0编辑  收藏  举报

导航