Pagini recente » Cod sursa (job #1318213) | Cod sursa (job #502534) | Cod sursa (job #511516) | Cod sursa (job #2432752) | Cod sursa (job #2823999)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n, m, pr, ul, xs, ys, xf, yf;
int a[1002][1002], b[1002][1002], cx[1000001], cy[1000001];
bool viz[1001][1001];
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
void Read()
{
fin >> n >> m;
fin.get();
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
char c;
fin >> c;
if(c == '.')
a[i][j] = 0;
else if(c == '*')
a[i][j] = -1;
else if(c == 'D')
{
a[i][j] = -2;
ul++;
cx[ul] = i;
cy[ul] = j;
}
else if(c == 'I')
{
a[i][j] = -3;
xs = i; // a[xs,ys] - start
ys = j;
}
else if(c == 'O')
{
a[i][j] = -4;
xf = i; // a[xf,yf] - final
yf = j;
}
}
fin.get();
}
}
void LEE()
{
pr = 1;
while(pr <= ul)
{
int xc = cx[pr];
int yc = cy[pr];
for(int i = 0; i <= 3; ++i)
{
int xv = xc + dx[i];
int yv = yc + dy[i];
if(xv >= 1 && xv <= n && yv >= 1 && yv <= m)
if(a[xv][yv] == 0)
{
if(a[xc][yc] == -2)
{
a[xv][yv] = 1;
ul++;
cx[ul] = xv;
cy[ul] = yv;
}
else
{
a[xv][yv] = a[xc][yc] + 1;
ul++;
cx[ul] = xv;
cy[ul] = yv;
}
}
}
pr++;
}
}
int le(int val)
{
pr = ul =1;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
viz[i][j] = 0;
cx[pr] = xs;
cy[pr] = ys;
viz[xs][ys] = 1;
while(pr <= ul)
{
int xc = cx[pr];
int yc = cy[pr];
for(int i = 0; i <= 3; ++i)
{
int xv = xc + dx[i];
int yv = yc + dy[i];
if(xv >= 1 && xv <= n && yv >=1 && yv <= m)
if((a[xv][yv] >= val || a[xv][yv] == -4) && (a[xv][yv] > 0 || a[xv][yv] == -4) && viz[xv][yv] == 0)
{
if(a[xv][yv] == -4)
return 1;
else
{
viz[xv][yv] = 1;
ul++;
cx[ul] = xv;
cy[ul] = yv;
}
}
}
pr++;
}
return 0;
}
void Solve()
{
int s = 1;
int d = n + m;
while(s <= d)
{
int mij = s + (d-s)/2;
if(le(mij) == 1)
s = mij + 1;
else
d = mij - 1;
}
if((s-1) > 0)
fout << s-1;
else
fout << -1;
}
int main()
{
Read();
LEE();
Solve();
return 0;
}