(2035)SCU

#include<iostream>
#include<cstdio>
#include<string.h>
#include<string>
#include<stack>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>


#define ll __int64
#define lll unsigned long long
#define MAX 10009
#define eps 1e-8
#define INF 0xfffffff
#define mod 1000000007


using namespace std;


/*
话说这题是郭大爷水过的,我觉得不是水,这个题的话,实在看不出二分图有啥优势,郭大爷用黑白染色法,把整个图案按照0,1染色,然后我们可以看0或者1的个数。
这题我看的是0,先记录#的个数。然后判断是否为0,如果为0,标记+1,如果最后标记的个数的2倍等于#的个数,说明可能。为什么,画个图就知道了


*/


int color[109][109];
char ma[109][109];


int main()
{
   int n,m;
   while(~scanf("%d%d",&n,&m))
   {
       if(n==0&&m==0)break;
       for(int i = 0;i<n;i++)
       {
           for(int j = 0;j<m;j++)
           {
               if(i%2==0)
               {
                   if(j%2==0)
                   {
                       color[i][j] = 0;
                   }
                   else
                   {
                       color[i][j] = 1;
                   }
               }
               else
               {
                   if(j%2==0)
                   {
                        color[i][j] = 1;
                   }
                   else
                   {
                        color[i][j] = 0;
                   }
               }
           }
       }
//       for(int i = 0;i<n;i++)
//       {
//           for(int j = 0;j<m;j++)
//           {
//               cout<<color[i][j];
//           }
//           cout<<endl;
//       }
       //染色完毕
       int sum1 = 0;
       int sum2 = 0;
       for(int i = 0;i<n;i++)
       {
           scanf("%s",ma[i]);
           for(int j = 0;j<m;j++)
           {
               if(ma[i][j]=='#')
               {
                   sum1++;
                   if(!color[i][j])
                   {
                       sum2++;
                   }
               }
           }
       }
       if(sum2*2==sum1)
        puts("POSSIBLE");
       else
        puts("IMPOSSIBLE");
       puts("");


   }
   return 0;
}

你可能感兴趣的:((2035)SCU)