Cod sursa(job #185594)

Utilizator katakunaCazacu Alexandru katakuna Data 25 aprilie 2008 18:11:41
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.05 kb
#include<stdio.h>
#define INF 200

int max,viz[1001][1001],fi,fj,ii,ji,sol,p,u,mij,c[2][1000001],n,D[2][1000001],DD,m,i,j,d[1001][1001],q[2][5]={{0,1,0,-1},{1,0,-1,0}};
char a[1001][1001];



int coada(int x){
int A,B,i,p=1,u=1;

c[0][p]=ii;
c[1][p]=ji;
viz[ii][ji]=x;

if(d[ii][ji]<x)
return 0;


   while(p<=u){

     for(i=0;i<=3;i++){
     A=c[0][p]+q[0][i];
     B=c[1][p]+q[1][i];


       if(viz[A][B]!=x&&d[A][B]>=x&&a[A][B]!='*'&&A>0&&A<=n&&B>0&&B<=m){
       u++;
       c[0][u]=A;
       c[1][u]=B;
       viz[A][B]=x;

	 if(A==fi&&B==fj)
	 return 1;

       }



     }


   p++;
   }

x=0;
return x;
}





void dist(int x,int y){

int A,B,p=1,u=1,i,X;

c[0][p]=x;
c[1][p]=y;
d[x][y]=0;


   while(p<=u){

     for(i=0;i<=3;i++){
     A=c[0][p]+q[0][i];
     B=c[1][p]+q[1][i];

       if(a[A][B]!='*'&& A>0 && A<=n && B>0 && B<=m){

       X=d[c[0][p]][c[1][p]]+1;

	  if(d[A][B]>(X)){
	  d[A][B]=X;
	  u++;
	  c[0][u]=A;
	  c[1][u]=B;
	  }

       }


     }


   p++;
   }



}




int main(){


for(i=1;i<=12;i++)
a[i][0]='0';


FILE *f=fopen("barbar.in","r");
fscanf(f,"%d %d\n",&n,&m);

  for(i=1;i<=n;i++){
    for(j=1;j<=m;j++){
    d[i][j]=INF;
    viz[i][j]=-1;


    fscanf(f,"%c",&a[i][j]);

      if(a[i][j]=='D'){
      DD++;
      D[0][DD]=i;
      D[1][DD]=j;
      }


      if(a[i][j]=='I'){
      ii=i;
      ji=j;
      }


      if(a[i][j]=='O'){
      fi=i;
      fj=j;
      }


    }
  fscanf(f,"\n");
  }


fclose(f);


max=-1;


 for(i=1;i<=DD;i++){
 dist(D[0][i],D[1][i]);
 }



  for(i=1;i<=n;i++)
        
  for(j=1;j<=m;j++){         
        
    if(d[i][j]>max&d[i][j]!=INF)
    max=d[i][j];         
        
        
  }     




p=0;
u=max;


  sol=-1;


   while(p<=u){
   mij=(p+u)/2;


     if(coada(mij)){
     sol=mij;
     p=mij+1;
     }

     else
     u=mij-1;


   }


FILE *g=fopen("barbar.out","w");
fprintf(g,"%d",sol);
fclose(g);

return 0;
}