Cod sursa(job #271931)

Utilizator rethosPaicu Alexandru rethos Data 6 martie 2009 08:58:59
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.43 kb
#include <stdio.h>
#include <string.h>
#define NM 1005
#define INF NM*NM
int n,m;
int pr,ult;
char a[NM][NM];
int d[NM][NM];
int viz[NM][NM];
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
int si,sj;
struct point{int x,y;};
point c[NM*NM];
int bfs(int);
/************/
inline void add(int x,int y)
{point g;
 g.x=x;
 g.y=y;
 c[++ult]=g;
}
/************/
int main()
{freopen("barbar.in","r",stdin);
 freopen("barbar.out","w",stdout);
 scanf("%d %d\n",&n,&m);
 pr=1;ult=0;
 int i,j,k;
 for (i=1;i<=n;i++)
        {scanf("%s",a[i]+1);
        }
 for (i=1;i<=n;i++)
        for (j=1;j<=m;j++)
                {d[i][j]=INF;
                 if (a[i][j]=='D')
                        {add(i,j);
                         d[i][j]=0;
                         viz[i][j]=1;
                        }
                }
 for (i=0;i<=n;i++)
        {a[i][0]='*';
         a[i][m+1]='*';
        }
 for (j=0;j<=m;j++)
        {a[0][j]='*';
         a[n+1][j]='*';
        }
 point p;
 while (pr<=ult)
        {p=c[pr++];
         for (k=0;k<=3;k++)
                {if (!viz[p.x+dx[k]][p.y+dy[k]]&&a[p.x+dx[k]][p.y+dy[k]]!='*')
                        {add(p.x+dx[k],p.y+dy[k]);
                         d[p.x+dx[k]][p.y+dy[k]]=d[p.x][p.y]+1;
                         viz[p.x+dx[k]][p.y+dy[k]]=1;
                        }
                }
        }
 for (i=1;i<=n;i++)
        for (j=1;j<=m;j++)
                {if (a[i][j]=='I')
                        {si=i;
                         sj=j;
                         break;
                        }
                }
 if (!bfs(0))
        {printf("-1");
         return 0;
        }
 int st=0,dr=n*m,mij;
 while (st<dr)
        {mij=(st+dr+1)/2;
         if (bfs(mij))
                {st=mij;
                }
             else
                {dr=mij-1;
                }
        }
 printf("%d",st);
 return 0;
}
int bfs(int s)
{pr=1;ult=0;
 memset(viz,0,sizeof(viz));
 if (d[si][sj]>=s)
        {add(si,sj);
         viz[si][sj]=1;
        }
 point p;
 int k;
 while (pr<=ult)
        {p=c[pr++];
         if (a[p.x][p.y]=='O') return 1;
         for (k=0;k<=3;k++)
                {if (!viz[p.x+dx[k]][p.y+dy[k]]&&d[p.x+dx[k]][p.y+dy[k]]>=s&&a[p.x+dx[k]][p.y+dy[k]]!='*')
                        {add(p.x+dx[k],p.y+dy[k]);
                         viz[p.x+dx[k]][p.y+dy[k]]=1;
                        }
                }
        }
 return 0;
}