Pagini recente » Cod sursa (job #2656433) | Cod sursa (job #389385) | Cod sursa (job #864683) | Cod sursa (job #2598574) | Cod sursa (job #2321506)
#include<fstream>
using namespace std;
#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()
{
ifstream cin("barbar.in");
ofstream cout("barbar.out");
cin>>n>>m>>c;
m--;
for (i=1;i<=n;i++)
{
for (j=0;j<=m;j++)
{
cin>>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;}
}
}
cout<<endl;
}
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;
}