Pagini recente » Cod sursa (job #382758) | Cod sursa (job #147483) | Cod sursa (job #1466908) | Cod sursa (job #2235865) | Cod sursa (job #2321541)
#include<stdio.h>
#define NMAX 1001
long lin[]= {1,-1,0,0};
long col[]= {0,0,-1,1};
long qqq,rez,c,aa,bb,in,b,qq,sf,l,x[NMAX][NMAX],y[NMAX][NMAX],z[NMAX][NMAX],i,j,k,n,m,a,xi,yi,xf,yf;
struct kkt
{
long X,Y,K;
};
kkt q[NMAX*NMAX];
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%ld%ld%c",&n,&m,&c);
m--;
for (i=1; i<=n; i++)
{
for (j=0; j<=m; j++)
{
scanf("%c",&c);
if (c=='D')
{
q[++sf].X=i;
q[sf].Y=j+1;
q[sf].K=0;
y[i][j+1]=2;
}
else if (c=='*')
y[i][j+1]=1;
else
{
if (c=='I')
{
xi=i;
yi=j+1;
}
if (c=='O')
{
xf=i;
yf=j+1;
}
}
}
scanf("\n");
}
in=1;
m++;
while (in<=sf)
{
for (i=0; i<=3; i++)
{
a=q[in].X+lin[i];
b=q[in].Y+col[i];
if (a>=1&&a<=n&&b>=1&&b<=m&&z[a][b]==0&&y[a][b]!=1)
{
sf++;
q[sf].X=a;
q[sf].Y=b;
q[sf].K=q[in].K+1;
z[a][b]=q[sf].K;
}
}
in++;
}
k=-1;
for (i=1; i<=n; i++)
for (j=1; j<=m; j++)
{
if (z[i][j]>k)
k=z[i][j];
y[i][j]=0;
}
aa=0;
bb=k;
rez=-1;
qqq=1;
while (qqq)
{
if (aa==bb) qqq=0;
j=(aa+bb)/2;
in=1;
sf=1;
q[1].X=xi;
q[1].Y=yi;
y[xi][yi]=1;
qq=0;
while (in<=sf)
{
for (i=0; i<=3; i++)
{
a=q[in].X+lin[i];
b=q[in].Y+col[i];
if (a>=1&&a<=n&&b>=1&&b<=m&&y[a][b]!=1&&z[a][b]>=j)
{
if (a==xf&&b==yf)
{
qq=1;
in=sf+100;
}
sf++;
q[sf].X=a;
q[sf].Y=b;
y[a][b]=1;
}
}
in++;
}
if(qq)
{
aa=j+1;
rez=j;
}
else
{
bb=j-1;
}
for (i=1; i<=n; i++)
for (l=1; l<=m; l++)
y[i][l]=0;
}
printf("%ld\n",rez);
return 0;
}