Pagini recente » Cod sursa (job #1785967) | Cod sursa (job #2813181) | Cod sursa (job #710636) | Cod sursa (job #1765128) | Cod sursa (job #2321504)
#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; //RASPUNSUL ESTE NU!!!!!!!!!
} 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;
}
// for (j=k;j>=0;j--)
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;}//{printf("%ld\n",j); return 0;}
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;
}