Pagini recente » Cod sursa (job #2186119) | Cod sursa (job #817766) | Cod sursa (job #2080613) | Cod sursa (job #2785507) | Cod sursa (job #2321548)
#include<stdio.h>
#define NMAX 1010
long lin[]= {1,-1,0,0};
long col[]= {0,0,-1,1};
long w[NMAX][NMAX],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]=1;
}
else if (c=='*')
{
y[i][j+1]=1;
w[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)
y[i][j]=w[i][j];
}
for (j=z[xi][yi]; j>=0; j--)
{
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)
{
printf("%ld\n",j);
return 0;
}
sf++;
q[sf].X=a;
q[sf].Y=b;
y[a][b]=1;
}
}
in++;
}
for (i=1; i<=n; i++)
for (l=1; l<=m; l++)
{
y[i][l]=w[i][l];
}
}
printf("-1\n");
return 0;
}