Cod sursa(job #96105)
#include<stdio.h>
int a[1000][1000], n, m, x1, y1, x2, y2, nr, b[1000][1000];
int dx[4]={0,1,0,-1}, dy[4]={1,0,-1,0};
typedef struct
{
int x, y;
} Coada;
Coada c[100000];
void citire()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d %d",&n,&m);
int i, j;
char x;
scanf("\n");
for (i=1; i<=n; i++)
{
for (j=1; j<=m; j++)
{
scanf("%c",&x);
switch(x)
{
case '.' : {a[i][j]=-1; break;}
case '*' : {a[i][j]=-2; break;}
case 'D' : {a[i][j]=0; c[++nr].x=i; c[nr].y=j;break;}
case 'I' : {x1=i, y1=j, a[i][j]=-1; break;}
case 'O' : {x2=i, y2=i, a[i][j]=-1; break;}
}
}
scanf("\n");
}
for (i=1; i<=n; i++) a[i][0]=a[i][m+1]=-2;
for (i=1; i<=m; i++) a[0][i]=a[n+1][i]=-2;
}
void parcurg()
{
int p, u, x, y, i;
p=1;
u=nr;
while (p<=u)
{
for (i=0; i<4; i++)
{x=c[p].x+dx[i];
y=c[p].y+dy[i];
if (a[x][y]!=-2)
{
if (a[x][y]==-1 || a[x][y]>a[c[p].x][c[p].y]+1)
{
u++;
c[u].x=x;
c[u].y=y;
a[x][y]=a[c[p].x][c[p].y]+1;
}
}
}
p++;
}
}
int verif (int dist)
{
int p, u, x, y, i;
p=1;
u=1;
c[1].x=x1; c[1].y=y1;
while (p<=u)
{
for (i=0; i<4; i++)
{x=c[p].x+dx[i];
y=c[p].y+dy[i];
if (a[x][y]!=-2)
{
if (a[x][y]>=dist && b[x][y]!=dist)
{
u++;
c[u].x=x;
c[u].y=y;
b[x][y]=dist;
if (x==x2 && y==y2) return 1;
}
}
}
p++;
}
return 0;
}
void afis()
{
int i, j;
for (i=1; i<=n; i++)
{
for (j=1; j<=m; j++)
printf("%3.d",a[i][j]);
printf("\n");
}
}
int main()
{
citire();
parcurg();
int i;
for (i=10; i>=0; i--) if (verif(i)) {printf("%d",i); break;}
if (i==-1) printf("%d",i);
return 0;
}