Cod sursa(job #318307)

Utilizator klamathixMihai Calancea klamathix Data 27 mai 2009 23:06:02
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.21 kb
#include<cstdio>
#include<queue>
#define MAXN 1005

using namespace std;

int i , j , N , M , last , A[MAXN][MAXN] , left , right , mid , count ,B[MAXN][MAXN];
int vert[5] = { 0 , 0 , 1 , - 1};
int oriz[5] = { 1 , - 1 , 0 , 0 };
char c;

struct coord { 
       int x;
       int y;
       };
coord current , aux , start , end , drag ;
queue <coord> Q;



inline int ok ( coord a ) { 
       if ( a.x >= 1 && a.x <= N )
          {if( a.y >= 1 && a.y <= M )
           {   if(  A[a.x][a.y] == 0 ) 
              return 1;}}
       return 0;
       }
       

void BFS()
{
     while ( !Q.empty() )
     {
           current = Q.front() , Q.pop();
           
           
           for( i = 0 ; i <= 3 ; ++i)
           {
                aux.x = current.x + vert[i] , aux.y = current.y + oriz[i];      
                //count++;
                if(ok(aux))
                {
                     A[aux.x][aux.y] = A[current.x][current.y] + 1;
                     Q.push(aux);
                }
           }
     }
}


int check ( int L ) 
{
    
    int i , j;
    
    while(!Q.empty())
    Q.pop();
    
    if(A[start.x][start.y] < L ) return 0;
    
    for( i = 1 ; i <= N ; i++)   
         for( j = 1 ; j <= M ; j++)
              if(B[i][j] != -1) B[i][j] = 0;
    
    Q.push(start);
    
    B[start.x][start.y] = 1;
    
    while (!Q.empty()) 
    {
          current = Q.front() , Q.pop();
          B[current.x][current.y] = 1;
          if ( current.x == end.x && current.y == end.y ) return 1;
          
          for( i = 0 ; i <= 3 ; ++i ) {
               aux.x = current.x + vert[i];
               aux.y = current.y + oriz[i];
               if (  aux.x >= 1 && aux.x <= N && aux.y >= 1 && aux.y <= M  ) 
                   {
                           if(A[aux.x][aux.y] >= L && !B[aux.x][aux.y])
                             { 
                   B[aux.x][aux.y] = 1;  
                   Q.push(aux);
                               }
                   }
                   }
    }    

return 0;
}

int main ()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    
    scanf("%d %d\n",&N,&M);
    
    for ( i = 1 ; i <= N ; i++) {
        for( j = 1 ; j <= M; j++)
         {
             scanf("%c",&c);
             if ( c == 'D' )  {
                              A[i][j] = 1 ;
                              drag.x = i;
                              drag.y = j;
                              Q.push(drag);
                              }
             else if ( c == '*' ) A[i][j] = -1 , B[i][j] = -1;
             else if ( c == 'I' ) start.x = i , start.y = j;
             else if ( c == 'O' ) end.x = i , end.y = j;
         }
         scanf("\n");
    }
    
    BFS();
   /*
    for ( i = 1 ; i <= N ; i ++) {
        for( j = 1 ; j <= M ; j++)
             printf("%d ",A[i][j]);
        printf("\n");
        }
   */
    left = 1 , right = N * M;
    
    while ( left <= right ) { 
          mid = ( left + right ) / 2;
          if( check(mid)  ) last = mid  , left = mid + 1;
              else right = mid - 1;
          }

printf("%d\n",last - 1);

return 0;
          
}