Cod sursa(job #1053155)

Utilizator j.loves_rockJessica Joanne Patrascu j.loves_rock Data 12 decembrie 2013 13:56:33
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.59 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;
}