Pagini recente » Cod sursa (job #237792) | Cod sursa (job #1858774) | Cod sursa (job #1740051) | Cod sursa (job #1552761) | Cod sursa (job #2785909)
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const string fn = "barbar";
ifstream fin(fn + ".in");
ofstream fout(fn + ".out");
int n, m;
int xi, yi, xo, yo;
int d[1005][1005];
char a[1005][1005];
bitset<1003> v[1003];
inline bool in(int &i, int &j)
{
return 1 <= i && i <= n && 1 <= j && j <= m;
}
const int dx[] = { -1, 1, 0, 0};
const int dy[] = {0, 0, -1, 1};
queue<pair<int, int> > q;
void f()
{
int i, j, x, y;
while (!q.empty())
{
i = q.front().first;
j = q.front().second;
q.pop();
for (int k = 0; k < 4; ++k)
{
x = i + dx[k];
y = j + dy[k];
if (in(x, y) && d[x][y] > d[i][j] + 1 && a[x][y] != '*')
{
d[x][y] = d[i][j] + 1;
q.push({x, y});
}
}
}
}
void fl(int i, int j, int val)
{
int x, y;
stack<pair<int , int > > s;
s.push({i, j});
while (!s.empty())
{
i = s.top().first;
j = s.top().second;
s.pop();
for (int k = 0; k < 4; ++k)
{
x = i + dx[k];
y = j + dy[k];
if (in(x, y) && !v[x][y] && d[x][y] >= val && a[x][y] != '*')
{
v[x][y] = 1;
if (x == xo && y == yo)
return;
s.push({x, y});
}
}
}
}
int main()
{
fin >> n >> m;
for (int i = 1; i <= n; ++i)
fin >> (a[i] + 1);
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
d[i][j] = 2000000;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
if (a[i][j] == 'I') xi = i, yi = j;
else if (a[i][j] == 'O') xo = i, yo = j;
else if (a[i][j] == 'D') q.push({i, j}), d[i][j] = 0;
f();
int st, dr, mid, ans;
st = 1; dr = d[xi][yi] + 1;
ans = -1;
while (st <= dr)
{
mid = (st + dr) >> 1;
for (int i = 1; i <= n; ++i)
v[i].reset();
fl(xi, yi, mid);
if (v[xo][yo] == 1)
{
ans = mid;
st = mid + 1;
}
else dr = mid - 1;
}
fout << ans << '\n';
fin.close();
fout.close();
return 0;
}