Pagini recente » Cod sursa (job #444060) | Cod sursa (job #2611877) | Cod sursa (job #3150074) | Cod sursa (job #2465163) | Cod sursa (job #1329460)
#include<cstdio>
struct eu{int x,y,val;};
eu v[1000001];
struct eu2{int x,y;};
eu vc[1000001];
char a[1001][1001],c,b[1001][1001];
int i,j,n,m,h,l1,l2,mid,in,sf,x1,x2,y1,y2,o=-1;
int lc,cc,linie[]={1,0,-1,0},coloana[]={0,-1,0,1};
int main ()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d%d%c",&n,&m,&c);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%c",&a[i][j]);
if(a[i][j]=='I')
{
x1=i;
y1=j;
}
if(a[i][j]=='O')
{
x2=i;
y2=j;
}
}
scanf("%c",&c);
}
l1=1;
l2=n*m;
while(l1<=l2)
{
mid=(l1+l2)/2;
in=1;
sf=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
b[i][j]=0;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
if(a[i][j]=='D')
{
sf++;
v[sf].x=i;
v[sf].y=j;
v[sf].val=mid-1;
b[i][j]='*';
}
if(a[i][j]=='*')
b[i][j]='*';
}
while(in<=sf)
{
b[v[in].x][v[in].y]='*';
if(v[in].val!=0)
for(i=0;i<4;i++)
{
lc=v[in].x+linie[i];
cc=v[in].y+coloana[i];
if(lc>=1&&lc<=n&&cc>=1&&cc<=m&&b[lc][cc]==0)
{
b[lc][cc]='*';
sf++;
v[sf].x=lc;
v[sf].y=cc;
v[sf].val=v[in].val-1;
}
}
in++;
}
in=sf=1;
vc[1].x=x1;
vc[1].y=y1;
b[x1][y1]=1;
int pp=0;
while(in<=sf)
{
for(i=0;i<4;i++)
{
lc=vc[in].x+linie[i];
cc=vc[in].y+coloana[i];
if(b[x2][y2]==0&&lc==x2&&cc==y2)
{
pp=1;
in=sf+1;
break;
}
if(lc>=1&&cc>=1&&lc<=n&&cc<=m&&b[lc][cc]==0)
{
sf++;
b[lc][cc]=1;
vc[sf].x=lc;
vc[sf].y=cc;
}
}
in++;
}
if(pp==1)
{
o=mid;
l1=mid+1;
}
else
l2=mid-1;
}
printf("%d",o);
return 0;
}