Pagini recente » Cod sursa (job #1612130) | Cod sursa (job #1400163) | Cod sursa (job #1163096) | Cod sursa (job #2872578) | Cod sursa (job #2552926)
#include <fstream>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int di[]={-1,0,1,0};
int dj[]={0,1,0,-1};
int n,m,i,j,d,k,maxim,si,sj,fi,fj,st,dr,x,y,vx,vy,cl[1000005],cc[1000005],a[1005][1005],b[1005][1005];
char ch;
int main()
{
fin >> n >> m;
for (i=1;i<=n;i++) for (j=1;j<=m;j++)
{
fin >> ch;
if (ch=='D')
{
dr++;
cl[dr]=i;
cc[dr]=j;
b[i][j]=1;
}
if (ch=='*') a[i][j]=-1;
if (ch=='I')
{
si=i;
sj=j;
}
if (ch=='O')
{
fi=i;
fj=j;
}
}
st=1;
while (st<=dr)
{
x=cl[st];
y=cc[st];
for (d=0;d<4;d++)
{
vx=x+di[d];
vy=y+dj[d];
if (vx>=1 && vx<=n && vy>=1 && vy<=m && b[vx][vy]==0 && a[vx][vy]!=-1)
{
b[vx][vy]=b[x][y]+1;
dr++;
cl[dr]=vx;
cc[dr]=vy;
}
}
st++;
}
for (d=0;d<4;d++)
{
x=si+di[d];
y=sj+dj[d];
maxim=max(maxim,b[x][y]);
}
for (k=maxim;k>1;k--)
{
st=1;
dr=1;
cl[1]=si;
cc[1]=sj;
a[si][sj]=k;
if (b[si][sj]<k) continue;
while (st<=dr)
{
x=cl[st];
y=cc[st];
for (d=0;d<4;d++)
{
vx=x+di[d];
vy=y+dj[d];
if (vx>=1 && vx<=n && vy>=1 && vy<=m && a[vx][vy]!=k && a[vx][vy]!=-1 && b[vx][vy]>=k)
{
a[vx][vy]=k;
dr++;
cl[dr]=vx;
cc[dr]=vy;
if (vx==fi && vy==fj)
{
fout << k-1;
return 0;
}
}
}
st++;
}
}
fout << -1;
return 0;
}