Cod sursa(job #196392)

Utilizator jupanubv92Popescu Marius jupanubv92 Data 26 iunie 2008 11:15:20
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.43 kb
#include<stdio.h>

int a[1003][1003],n,m,pi,pf,ppi,ppf;
int b[1003][1003];

const int dx[]={0,-1,0,1},
	  dy[]={-1,0,1,0};
int min(int a, int b)
 {
   return (a<b)? (a) : (b);
 }
int main()
{
 freopen("barbar.in","r",stdin);
 freopen("barbar.out","w",stdout);

 char c;
 scanf("%d %d",&n,&m);
 int x[1010000],y[1010000];
 long lf=0;
 for(int i=1;i<=n;i++)
  {c=fgetc(stdin);
   for(int j=1;j<=m;j++)
     {c=fgetc(stdin);
       if(c=='.') a[i][j]=0;
	else if(c=='I') {ppi=i;ppf=j;a[i][j]=0;}
		else if(c=='D') {a[i][j]=0;x[++lf]=i;y[lf]=j;}
			else if(c=='*') {a[i][j]=-1;}
			       else if(c=='O'){pi=i;pf=j;a[i][j]=0;}
     }
  }

 int j,_i,_j,v=lf,i;
 int ok=0,nr=0;
 while(ok==0)
 {ok=1;nr=0;
  for(long li=1;li<=lf;li++)
    {
     i=x[li];
     j=y[li];
     for(int k=0;k<4;k++)
       { _i=i+dx[k];
	     _j=j+dy[k];
	     if(_i<1||_i>n) continue;
	     if(_j<1||_j>m) continue;
	     if(a[_i][_j]<0||a[_i][_j]>0) continue;
	     {if(lf<999900)
	      {ok=1;
	       x[++lf]=_i;
	       y[lf]=_j;
	       a[_i][_j]=a[i][j]+1;
	       }
	     else {ok=0;
		   nr++;
		   x[nr]=_i;
		   y[nr]=_j;
		   a[_i][_j]=a[i][j]+1;
		   }
	     }
       }
    if(li<=v) a[i][j]=-1;
    }
 lf=nr;
 }
 lf=1;

 x[1]=ppi;
 y[1]=ppf;b[ppi][ppf]=a[ppi][ppf];

 ok=0;
 while(ok==0)
 {ok=1;nr=0;
  for(int li=1;li<=lf;li++)
  {
   i=x[li];
   j=y[li];
   for(int k=0;k<4;k++)
     {_i=i+dx[k];
       _j=j+dy[k];
      if(_i<1||i>n) continue;
      if(_j<1||j>m) continue;
      if(a[_i][_j]==-1) continue;
	  {if(lf<999900)
	    {
	 if(b[_i][_j] == 0)
	  {
	   b[_i][_j] = min(a[_i][_j], b[i][j]);
	   lf++;
	       x[lf]=_i;
	       y[lf]=_j;
	  continue;
	  }

         if(b[i][j] > b[_i][_j] && b[_i][_j] < a[_i][_j])
         {
           b[_i][_j] = min(b[i][j],a[_i][_j]);
           lf++;
	       x[lf]=_i;
	       y[lf]=_j;
         }
	    ok=1;
	    }
	   else
	     {
	      if(b[_i][_j] == 0)
          {
           b[_i][_j] = min(a[_i][_j], b[i][j]);
           nr++;
	       x[nr]=_i;
	       y[nr]=_j;
          continue;
          }

         if(b[i][j] > b[_i][_j] && b[_i][_j] < a[_i][_j])
         {
           b[_i][_j] = min(b[i][j],a[_i][_j]);
           nr++;
	       x[nr]=_i;
	       y[nr]=_j;
         }
        ok=0;
	     }
	   }
     }
  }
 lf=nr;
 }
 if(b[pi][pf]!=0) printf("%d\n",b[pi][pf]);
   else printf("-1\n");
 return 0;
}