Pagini recente » Cod sursa (job #1114249) | Cod sursa (job #672038) | Cod sursa (job #3123056) | clasament-teme | Cod sursa (job #271931)
Cod sursa(job #271931)
#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;
}