Cod sursa(job #187395)

Utilizator alexeiIacob Radu alexei Data 3 mai 2008 21:18:14
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.01 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 c[nmax][nmax];
int xi[nmax*nmax];
int yi[nmax*nmax];
int px,py;
int sx,sy;
int R,C;

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 sf)
{
     int aux1,aux2;
     int aux3,aux4;
     int i,j,inc;

     inc=1;    
     
     while( inc<=sf )
                    { 
                             aux1=xi[inc],aux2=yi[inc];
                             ++inc;
                            
                             
                             for(i=0; i<4; ++i)
                             {
                                      aux3=aux1+x[i];
                                      aux4=aux2+y[i];
                                      
                                      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;
                                          xi[++sf]=aux3;
                                          yi[sf]=aux4;
                                          }     
                             }

                     }



}

int search_for_the_path(int val)
{

       
     int inc=1,sf=1;
     int aux1,aux2;
     int aux3,aux4;
     int k;
     
     if( b[ xi[1] ][ yi[1] ]<val )
     return 1;
   
     while( inc<=sf )
     {
            
            aux1=xi[inc];
            aux2=yi[inc];

            ++inc;
            
            c[aux1][aux2]=val;
            
            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]!='*')
                         if( b[aux3][aux4]>=val && c[aux3][aux4]!=val)                   
                         {
                             if( aux3 == sx && aux4 == sy )
                             return 0;
                             
                             c[aux3][aux4]=val;
                             
                             ++sf;
                             xi[sf]=aux3;
                             yi[sf]=aux4;
                         }     
            }
     
     }
return 1;

}


int main()
{
   freopen("barbar.in","r",stdin);
   freopen("barbar.out","w",stdout);
    
   char aux;
   int nr=0,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;
    b[i][j]=mult;
    c[i][j]=mult;
    if( aux=='D' ){
    xi[++nr]=i;
    yi[nr]=j;
    b[i][j]=0;
    }
    else
    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
     { 
      lee_dragon(nr);
      
   //afis();
      
      int left=0,right=R*C,val;
      int pos;
      
      
      while( left<=right )
      {
             
      xi[1]=px;
      yi[1]=py;
     // printf("%d %d\n",left,right);
      val=(left+right)>>1;
      
      pos=search_for_the_path(val);
      //printf("am incercat cu %d \n",val);
      
      if( !pos )
          solfin=val,left=val+1;//printf("si a iesit bini %d\n",solfin); 
          //val va fi tot timpul cea mai varianta pt solfin
      else
          right=val-1;
      
      
      }
      
      printf("%d\n",solfin);
      
      }   
    
    
    return 0;
}