Cod sursa(job #21587)

Utilizator t30Rosu Teodor t30 Data 23 februarie 2007 21:25:10
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.61 kb
#include<stdio.h>
int n,m,s,e,sx,sy,ex,ey;
char v[1010][1010];
long D[1010][1010],p,q,d[1000100],sol;

void READ()
{  int i,j;
   FILE *f;

   f=fopen("barbar.in","r");
   fscanf(f,"%d %d",&n,&m);
   for(i=1;i<=n;i++)
     for(j=1;j<=m;j++)
	D[i][j]=-1;
   q=0;
   for(i=1;i<=n;i++){
	fscanf(f,"%s",&v[i]);
	for(j=0;j<=m;j++){
	  if(v[i][j]=='D'){ d[++q]=1001*i+j+1; D[i][j+1]=0; }
	  if(v[i][j]=='*') D[i][j+1]=-2;
	  if(v[i][j]=='I') { sx=i; sy=j+1; }
	  if(v[i][j]=='O') { ex=i; ey=j+1; }
	}


   }

   fclose(f);
}

void BUILD()
{  int x,y,i,j;
   while(p<=q){
     x=d[p]/1001;
     y=d[p]%1001;

     i=x-1; j=y;
     if(i>0 && i<=n && j>0 && j<=m && D[i][j]==-1 && v[i][j-1]!='*'){
	     D[i][j]=D[x][y]+1;
	     d[++q]=1001*i+j;
     }
     i=x+1; j=y;
     if(i>0 && i<=n && j>0 && j<=m && D[i][j]==-1 && v[i][j-1]!='*'){
	     D[i][j]=D[x][y]+1;
	     d[++q]=1001*i+j;
     }
     i=x; j=y-1;
     if(i>0 && i<=n && j>0 && j<=m && D[i][j]==-1 && v[i][j-1]!='*'){
	     D[i][j]=D[x][y]+1;
	     d[++q]=1001*i+j;
     }
     i=x; j=y+1;
     if(i>0 && i<=n && j>0 && j<=m && D[i][j]==-1 && v[i][j-1]!='*'){
	     D[i][j]=D[x][y]+1;
	     d[++q]=1001*i+j;
     }

     p++;
   }
}
int ok(int k)
{  long exit,i,j,x,y;
   q=1;p=1;
   d[1]=sx*1001+sy;
   exit=1001*ex+ey;

   for(i=1;i<=n;i++)
     for(j=1;j<=m;j++)
       v[i][j]=0;
   v[sx][sy]=1;

   while(p<=q){
     x=d[p]/1001;
     y=d[p]%1001;

     i=x-1; j=y;
     if(i>0 && i<=n && j>0 && j<=m && !v[i][j] && D[i][j]!=-2 && D[i][j]>=k){
	     v[i][j]=1;
	     d[++q]=1001*i+j;
	     if(d[q]==exit) return 1;
     }
     i=x+1; j=y;
     if(i>0 && i<=n && j>0 && j<=m && !v[i][j] && D[i][j]!=-2 && D[i][j]>=k){
	     v[i][j]=1;
	     d[++q]=1001*i+j;
	     if(d[q]==exit) return 1;
     }
     i=x; j=y-1;
     if(i>0 && i<=n && j>0 && j<=m && !v[i][j] && D[i][j]!=-2 && D[i][j]>=k){
	     v[i][j]=1;
	     d[++q]=1001*i+j;
	     if(d[q]==exit) return 1;
     }
     i=x; j=y+1;
     if(i>0 && i<=n && j>0 && j<=m && !v[i][j] && D[i][j]!=-2 && D[i][j]>=k){
	     v[i][j]=1;
	     d[++q]=1001*i+j;
	     if(d[q]==exit) return 1;
     }

     p++;
   }
   return 0;
}

void SOLVE()
{  long step;
   for(step=1;step<n*m;step=2*step);
   for(sol=0;step;step=step/2)
     if(ok(sol+step)) sol=sol+step;
}

void PRINT()
{
   FILE *g;
   g=fopen("barbar.out","w");
   if(sol!=0 || ok(0)==1) fprintf(g,"%ld",sol);
   else if(sx==ex && sy=ey) fprintf(g,"%ld",D[sx][sy]);
   else fprintf(g,"-1");
   fclose(g);
}

int main()
{
   READ();
   BUILD();
   SOLVE();
   PRINT();
return 0;
}