Cod sursa(job #187292)

Utilizator alexeiIacob Radu alexei Data 2 mai 2008 21:48:28
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.56 kb
#include<stdio.h>
#define nmax 1001

const int x[]={0, 1, -1, 0};
const int y[]={1, 0,  0,-1};
const int mult=100001;

char a[nmax][nmax];
int b[nmax][nmax];
int xi[nmax*nmax];
int yi[nmax*nmax];
int px,py;
int sx,sy;
int R,C,nr;

void afis()
{
int i,j;
    
    for(i=1; i<=R; ++i){
     for(j=1; j<=C; ++j)
     printf("%d ",b[i][j]);
    printf("\n");
    }
    printf("\n");  
      
}

void lee_dragon(int val)
{
     int i,j;
     int aux1,aux2;
     int aux3,aux4;
     int k,inc=1,sf=0;

for(i=1; i<=R; ++i)
 for(j=1; j<=C; ++j)
 {
  b[i][j]=mult;        
 
  if( a[i][j]=='D' )
  {
      b[i][j]=0;
      ++sf;
      xi[sf]=i;
      yi[sf]=j; 
  }
}
  //afis();

  while( inc<=sf )
  {
  aux1=xi[inc];
  aux2=yi[inc];

  for(k=0; k<4; ++k)
  {
          aux3=aux1+x[k];     
          aux4=aux2+y[k];
          
           if( aux3  && aux4  && aux3<=R && aux4<=C)
                     if( a[aux3][aux4]!='*')
                         if( b[aux3][aux4] > b[aux1][aux2]+1 )
                         {
                             b[aux3][aux4]=b[aux1][aux2]+1;
                             ++sf;
                             xi[sf]=aux3;
                             yi[sf]=aux4;
                         }
  }
  ++inc;
  }
//printf("(val)%d\n",val);
for(i=1; i<=R; ++i)
 for(j=1; j<=C; ++j)
 {
  if( b[i][j]<val || a[i][j]=='*' )
  b[i][j]=666;
  else
  b[i][j]=1;
 }

}

int search_for_the_path()
{

     int aux1,aux2;
     int aux3,aux4;
     int k,inc=1,sf=1;
    // printf("%d %d %d %d\n",sx,sy,px,py);
     
     if( b[sx][sy]==666 || b[px][py]==666 )
     return 1;
     
     b[px][py]=666;
     
     while( inc<=sf )
     {
            aux1=xi[inc];
            aux2=yi[inc];
            
            
            for(k=0; k<4; ++k)
            {
                     aux3=aux1+x[k];     
                     aux4=aux2+y[k];
          
                     if( aux3>0 && aux4>0 && aux3<=R && aux4<=C)
                         if( a[aux3][aux4]!='*' && b[aux3][aux4]!=666 )
                        {
                             if( aux3==sx && aux4==sy )
                             return 0;
                             
                             b[aux3][aux4]=666;
                             
                             ++sf;
                             
                             xi[sf]=aux3;
                             yi[sf]=aux4;
                             
                        }                    
            }
     ++inc;
     }


     return 1;

}

int main()
{
   freopen("barbar.in","r",stdin);
   freopen("barbar.out","w",stdout);
    
   char aux;
   int i,j;
   
   scanf("%d%d",&R,&C);
   
   for(i=1; i<=R; ++i){
    for(j=1; j<=C; ++j){
    scanf(" %c",&aux);
    a[i][j]=aux;
    
    if( aux=='I' ){
    px=i;
    py=j;
    }
    else
    if( aux=='O' ){
    sx=i;
    sy=j;
    }
    
    } 
   }
   
   int solfin=-1; 
   
     if( a[px][py]=='*' || a[sx][sy]=='D' || a[sx][sy]=='*' || a[px][py]=='D' )
     printf("-1\n");
     else
     { 
      
   //afis();
      
      int left=0,right=R*C,val,mij;
      
      while( left<=right )
      {
     
      mij=(left+right)>>1;       
             
      lee_dragon(mij);
      
      xi[1]=px;
      yi[1]=py;
      
      val=search_for_the_path();
      
      if( !val )
      solfin=mij,left=mij+1;
      else
      right=mij-1;
      
      }
      
      printf("%d\n",solfin);
      
      }   
    
    
    return 0;
}