Cod sursa(job #2555020)

Utilizator MocalinnoMoca Andrei Catalin Mocalinno Data 23 februarie 2020 16:55:25
Problema Barbar Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.14 kb
#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
}