Cod sursa(job #283280)

Utilizator taloibogdanTaloi Bogdan Cristian taloibogdan Data 18 martie 2009 22:44:27
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include<stdio.h>
#include<string.h>
struct vec{long x,y;};
long f[1005][1005],dx[]={0,0,0,1,-1},dy[]={0,1,-1,0,0},n,m1,i,j,ld,viz[1005][1005],max,st,dr,da,bun,ff,m;
vec d[7000005],sa,fi;
char x;
long drum(long m,vec p)
{long i;
 vec pp;
 viz[p.x][p.y]=1;
 if(p.x==fi.x&&p.y==fi.y)return 1;
 for(i=1;i<=4;++i)
    if(p.x+dx[i]<=n&&p.x+dx[i]>0&&p.y+dy[i]<=m1&&p.y+dy[i]>0)
     if(f[p.x+dx[i]][p.y+dy[i]]>=m&&!viz[p.x+dx[i]][p.y+dy[i]]){pp.x=p.x+dx[i];pp.y=p.y+dy[i];if(drum(m,pp))return 1;}
 return 0;
}
void bf(long dr)
{long st,i;
 st=1;
 while(st<=dr)
  {for(i=1;i<=4;++i)
      if(d[st].x+dx[i]<=n&&d[st].x+dx[i]>0&&d[st].y+dy[i]<=m1&&d[st].y+dy[i]>0)
      if(f[d[st].x][d[st].y]+1<f[d[st].x+dx[i]][d[st].y+dy[i]])
        {f[d[st].x+dx[i]][d[st].y+dy[i]]=f[d[st].x][d[st].y]+1;
         d[++dr].x=d[st].x+dx[i];
         d[dr].y=d[st].y+dy[i];}
   ++st;}
}
int main()
{
 freopen("barbar.in","r",stdin);
 freopen("barbar.out","w",stdout);
 scanf("%ld%ld\n",&n,&m1);
 for(i=1;i<=n;++i)
    {
    for(j=1;j<=m1;++j)
       {scanf("%c ",&x);
        f[i][j]=2000000000;
        if(x=='D')d[++ld].x=i,d[ld].y=j,f[i][j]=0;
        if(x=='I')sa.x=i,sa.y=j;
        if(x=='O')fi.x=i,fi.y=j;
        if(x=='*')f[i][j]=-1;}
    scanf("\n");}
 bf(ld);
 max=f[sa.x][sa.y];
 if(max>f[fi.x][fi.y])max=f[fi.x][fi.y];
 st=0;dr=max;
 if(f[fi.x][fi.y]==2000000000){printf("-1\n");return 0;}
 while(st<=dr)
   {m=(st+dr)/2;
    da=drum(m,sa);
    for(i=1;i<=n;++i)memset(viz[i],0,sizeof(viz[i]));
    if(da){ff=1;bun=m;st=m+1;}
     else dr=m-1;}
 if(!ff)printf("-1\n");
   else printf("%ld\n",bun);
 return 0;
}