Cod sursa(job #1979398)

Utilizator finna1Finna Magdalena finna1 Data 10 mai 2017 16:02:25
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.04 kb
#include<cstdio>
char ch[1005][1005];
int l[1000005],c[1000005],viz[1005][1005],d[1005][1005],dx[]={0,-1,0,1,0},dy[]={0,0,1,0,-1};
int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    int r,co,i,j,x,y,nx,ny,f=1,b=0,st=0,dr=0,mij,last=-1,ix,iy,fx,fy,ok=0;
    scanf("%d%d\n",&r,&co);
    for(i=1;i<=r;i++)
        {
        gets(ch[i]+1);
        for(j=1;j<=co;j++)
            {
            if (ch[i][j]=='D')
                l[++b]=i,c[b]=j,viz[i][j]=1;
            if (ch[i][j]=='I')
                ix=i,iy=j;
            if (ch[i][j]=='O')
                fx=i,fy=j;
            }
        scanf("\n");
        }
    for(i=0;i<=co+1;i++)
        ch[0][i]=ch[r+1][i]='*';
    for(i=0;i<=r+1;i++)
        ch[i][0]=ch[i][co+1]='*';
    while(f<=b)
      {
      x=l[f];
      y=c[f];
      f++;
      if (d[x][y]>dr)
          dr=d[x][y];
      for(i=1;i<=4;i++)
          {
          nx=x+dx[i];
          ny=y+dy[i];
          if (ch[nx][ny]!='*' && viz[nx][ny]==0)
              {
              l[++b]=nx;
              c[b]=ny;
              d[nx][ny]=d[x][y]+1;
              viz[nx][ny]=1;
              }
          }
      }
    while(st<=dr)
      {
      mij=(st+dr)/2;
      for(i=1;i<=r;i++)
          for(j=1;j<=co;j++)
              viz[i][j]=0;
      if (d[ix][iy]<mij)
          {
          dr=mij-1;
          continue;
          }
      f=1;
      b=1;
      l[1]=ix;
      c[1]=iy;
      viz[ix][iy]=1;
      while(f<=b)
        {
        x=l[f];
        y=c[f];
        f++;
        for(i=1;i<=4;i++)
            {
            nx=x+dx[i];
            ny=y+dy[i];
            if (ch[nx][ny]!='*' && d[nx][ny]>=mij && viz[nx][ny]==0)
                {
                viz[nx][ny]=1;
                l[++b]=nx;
                c[b]=ny;
                }
            }
        }
      if (viz[fx][fy]==1)
          {
          last=mij;
          st=mij+1;
          }
      else
          dr=mij-1;
      }
    printf("%d\n",last);
return 0;
}