Pagini recente » Cod sursa (job #221322) | Cod sursa (job #1427686) | Cod sursa (job #700838) | Cod sursa (job #2096195) | Cod sursa (job #2555020)
#include <bits/stdc++.h>
#define DAU ios::sync_with_stdio(false); fin.tie(0); fout.tie(0);
#define PLEC fin.close(); fout.close(); return 0;
using namespace std;
using VI = vector<int>;
using VVI = vector<VI>;
using VB = vector<bool>;
using VVB = vector<VB>;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int di[] {0, 0, 1, -1};
const int dj[] {1, -1, 0, 0};
const int inf(1e9);
char mat[1005][1005];
int n, m, st, dr, mid, res(-1), xi, yi, xf, yf, x, y, nx, ny;
VVI dg;
VVB viz;
queue<pair<int, int>> q;
inline bool Inside(int x, int y)
{
if (x < 1 || x > n || y < 1 || y > m)
return false;
return (mat[x][y] != '*');
}
inline bool Check(int k)
{
if (dg[xi][yi] < k || dg[xf][yf] < k)
return false;
q.emplace(xi, yi);
viz = VVB(n + 2, VB(m + 2));
while (!q.empty())
{
tie(x, y) = q.front();
viz[x][y] = true;
q.pop();
for (int dir = 0; dir < 4; ++dir)
{
nx = x + di[dir];
ny = y + dj[dir];
if (Inside(nx, ny) && dg[nx][ny] >= k && !viz[nx][ny])
q.emplace(nx, ny);
}
}
return viz[xf][yf];
}
int main()
{
DAU
fin >> n >> m;
dg = VVI(n + 2, VI(n + 2, inf));
for (int i = 1; i <= n; ++i)
{
fin >> (mat[i] + 1);
for (int j = 1; j <= m; ++j)
if (mat[i][j] == 'D')
q.emplace(i, j), dg[i][j] = 0;
else if (mat[i][j] == 'I')
xi = i, yi = j;
else if (mat[i][j] == 'O')
xf = i, yf = j;
}
while (!q.empty())
{
tie(x, y) = q.front();
q.pop();
for (int dir = 0; dir < 4; ++dir)
{
nx = x + di[dir];
ny = y + dj[dir];
if (Inside(nx, ny) && dg[nx][ny] > dg[x][y] + 1)
dg[nx][ny] = dg[x][y] + 1, q.emplace(nx, ny);
}
}
st = 0, dr = n * m;
while (st <= dr)
{
mid = (st + dr) / 2;
if (Check(mid))
res = mid, st = mid + 1;
else dr = mid - 1;
}
fout << res;
PLEC
}