Pagini recente » Cod sursa (job #1405130) | Cod sursa (job #1055669) | Cod sursa (job #2611713) | Cod sursa (job #1579269) | Cod sursa (job #1869491)
#include <fstream>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m,i,j,a[1005][1005],b[1005][1005],k,c[5][1000005],t;
int istart,jstart,ifin,jfin,ic,jc,iv,jv,p,u,st,dr,mid,d,ok;
int di[] = {1,-1,0,0};
int dj[] = {0,0,1,-1};
char x;
int main()
{
fin >> n >> m;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
{
fin>>x;
if (x == '*')
{
a[i][j] = -1;
b[i][j] = -1;
}
if (x == 'D')
{
k++;
c[0][k] = i;
c[1][k] = j;
b[i][j] = -1;
}
if (x == 'I')
{
istart = i;
jstart = j;
}
if (x == 'O')
{
ifin = i;
jfin = j;
}
}
p = 1;
u = k;
while (p<=u)
{
ic = c[0][p];
jc = c[1][p];
p++;
for (d=0;d<=3;d++)
{
iv = ic+di[d];
jv = jc+dj[d];
if (iv>=1&&iv<=n&&jv>=1&&jv<=m&&a[iv][jv]==0)
{
u++;
c[0][u] = iv;
c[1][u] = jv;
a[iv][jv] = a[ic][jc]+1;
/*if (iv == ifin && jv == jfin)
t = 1;*/
}
}
}
st = 1;
dr = max(n,m)*max(n,m)/2;
while (st <= dr)
{
mid = (st+dr)/2;
ok = 0;
p = 1;
u = 1;
c[0][1] = istart;
c[1][1] = jstart;
if (a[istart][jstart] >= mid)
{
while (p<=u)
{
ic = c[0][p];
jc = c[1][p];
for (d=0;d<=3;d++)
{
iv = ic+di[d];
jv = jc+dj[d];
if (iv>=1&&iv<=n&&jv>=1&&jv<=m&&a[iv][jv]>=mid&&b[iv][jv]==0)
{
u++;
c[0][u] = iv;
c[1][u] = jv;
b[iv][jv] = 1+b[ic][jc];
if (iv==ifin && jv==jfin)
ok = 1;
}
}
p++;
}
}
if (ok == 1)
st = mid+1;
else
dr = mid-1;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
if (b[i][j] != -1)
b[i][j] = 0;
}
if (dr <= 0)
{
fout << -1;
return 0;
}
fout << dr;
return 0;
}