Cod sursa(job #324664)

Utilizator taloibogdanTaloi Bogdan Cristian taloibogdan Data 16 iunie 2009 17:20:30
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 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;  
}