Section 2.1 - The Castle

  1  #include  < iostream >
  2 
  3  using   namespace  std;
  4 
  5  int  n, m;
  6  int  castleStructure[ 50 ][ 50 ];
  7  int  castleRegion[ 50 ][ 50 ];
  8 
  9  int  regionCnt;
 10  int  areaOfRegions[ 2500 ];
 11 
 12  void  getRegion( int  i,  int  j)
 13  {
 14       if  (castleRegion[i][j]  !=   - 1 )
 15           return ;
 16      castleRegion[i][j]  =  regionCnt;
 17       if  ((castleStructure[i][j]  &   1 ==   0 )    // W
 18          getRegion(i, j  -   1 );
 19       if  ((castleStructure[i][j]  &   2 ==   0 )    // N
 20          getRegion(i  -   1 , j);
 21       if  ((castleStructure[i][j]  &   4 ==   0 )    // E
 22          getRegion(i, j  +   1 );
 23       if  ((castleStructure[i][j]  &   8 ==   0 )    // S
 24          getRegion(i  +   1 , j);
 25  }
 26 
 27  int  main()
 28  {
 29      freopen( " castle.in " " r " , stdin);
 30      freopen( " castle.out " " w " , stdout);
 31 
 32      cin  >>  m  >>  n;
 33       for  ( int  i  =   0 ; i  <  n; i ++ )
 34       for  ( int  j  =   0 ; j  <  m; j ++ )
 35          cin  >>  castleStructure[i][j];
 36 
 37      memset(castleRegion,  255 sizeof (castleRegion));
 38 
 39       for  ( int  i  =   0 ; i  <  n; i ++ )
 40       for  ( int  j  =   0 ; j  <  m; j ++ )
 41           if  (castleRegion[i][j]  ==   - 1 )
 42          {
 43              getRegion(i, j);
 44              regionCnt ++ ;
 45          }
 46 
 47       // ans 1
 48      cout  <<  regionCnt  <<  endl;
 49 
 50       for  ( int  i  =   0 ; i  <  n; i ++ )
 51       for  ( int  j  =   0 ; j  <  m; j ++ )
 52          areaOfRegions[castleRegion[i][j]] ++ ;
 53 
 54       int  maxAreaOfRegions  =   0 ;
 55       for  ( int  i  =   0 ; i  <  regionCnt; i ++ )
 56          maxAreaOfRegions  >?=  areaOfRegions[i];
 57 
 58       // ans 2
 59      cout  <<  maxAreaOfRegions  <<  endl;
 60 
 61       int  maxAreaAfterRemoveOneWall  =   0 ;
 62       struct  {  int  x, y, dir; } theWallToRemove;
 63 
 64       for  ( int  j  =   0 ; j  <  m; j ++ )
 65           for  ( int  i  =  n  -   1 ; i  >=   0 ; i -- )
 66          {
 67               if  ((castleStructure[i][j]  &   1 ==   1   &&  j  -   1   >=   0 )    // W
 68              {
 69                   if  (castleRegion[i][j]  ==  castleRegion[i][j  -   1 ])
 70                       continue ;
 71                   int  t  =  areaOfRegions[castleRegion[i][j]]  +  areaOfRegions[castleRegion[i][j  -   1 ]];
 72                   if  (t  >  maxAreaAfterRemoveOneWall)
 73                  {
 74                      maxAreaAfterRemoveOneWall  =  t;
 75                      theWallToRemove.x  =  i;
 76                      theWallToRemove.y  =  j;
 77                      theWallToRemove.dir  =   1 ;
 78                  }
 79              }
 80               if  ((castleStructure[i][j]  &   2 ==   2   &&  i  -   1   >=   0 )    // N
 81              {
 82                   if  (castleRegion[i][j]  ==  castleRegion[i  -   1 ][j])
 83                       continue ;
 84                   int  t  =  areaOfRegions[castleRegion[i][j]]  +  areaOfRegions[castleRegion[i  -   1 ][j]];
 85                   if  (t  >  maxAreaAfterRemoveOneWall)
 86                  {
 87                      maxAreaAfterRemoveOneWall  =  t;
 88                      theWallToRemove.x  =  i;
 89                      theWallToRemove.y  =  j;
 90                      theWallToRemove.dir  =   2 ;
 91                  }
 92              }
 93               if  ((castleStructure[i][j]  &   4 ==   4   &&  j  +   1   <  m)    // E
 94              {
 95                   if  (castleRegion[i][j]  ==  castleRegion[i][j  +   1 ])
 96                       continue ;
 97                   int  t  =  areaOfRegions[castleRegion[i][j]]  +  areaOfRegions[castleRegion[i][j  +   1 ]];
 98                   if  (t  >  maxAreaAfterRemoveOneWall)
 99                  {
100                      maxAreaAfterRemoveOneWall  =  t;
101                      theWallToRemove.x  =  i;
102                      theWallToRemove.y  =  j;
103                      theWallToRemove.dir  =   4 ;
104                  }
105              }
106               if  ((castleStructure[i][j]  &   8 ==   8   &&  i  +   1   <  n)    // S
107              {
108                   if  (castleRegion[i][j]  ==  castleRegion[i  +   1 ][j])
109                       continue ;
110                   int  t  =  areaOfRegions[castleRegion[i][j]]  +  areaOfRegions[castleRegion[i  +   1 ][j]];
111                   if  (t  >  maxAreaAfterRemoveOneWall)
112                  {
113                      maxAreaAfterRemoveOneWall  =  t;
114                      theWallToRemove.x  =  i;
115                      theWallToRemove.y  =  j;
116                      theWallToRemove.dir  =   8 ;
117                  }
118              }
119          }
120 
121       // ans 3
122      cout  <<  maxAreaAfterRemoveOneWall  <<  endl;
123      cout  <<  theWallToRemove.x  +   1   <<   '   '
124            <<  theWallToRemove.y  +   1   <<   '   ' ;
125       if  (theWallToRemove.dir  ==   1 ) cout  <<   ' W '   <<  endl;
126       if  (theWallToRemove.dir  ==   2 ) cout  <<   ' N '   <<  endl;
127       if  (theWallToRemove.dir  ==   4 ) cout  <<   ' E '   <<  endl;
128       if  (theWallToRemove.dir  ==   8 ) cout  <<   ' S '   <<  endl;
129 
130       return   0 ;
131  }
132 

你可能感兴趣的:(Section 2.1 - The Castle)