Cod sursa(job #2527249)

Utilizator DariusDCDarius Capolna DariusDC Data 19 ianuarie 2020 21:12:34
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.53 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("barbar.in");
ofstream fout("barbar.out");

int maxim;
int sol = -1;
const int nmax = 1005;
int n, m;
char mat[nmax][nmax];
int d[nmax][nmax];
int a[nmax][nmax];
pair <int, int> start, stop;
queue <pair <int, int> > q;

int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};

inline void read()
{
    fin >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            fin >> mat[i][j];
            if (mat[i][j] == 'I')
                start = {i, j};
            if (mat[i][j] == 'O')
                stop = {i, j};
            if (mat[i][j] == 'D')
                q.push({i, j});
        }
    }
}

inline bool ok(int i, int j)
{
    return (i > 0 && j > 0 && i <= n && j <= m && mat[i][j] != 'D' && mat[i][j] != '*');
}

inline bool OK(int i, int j)
{
    return (a[i][j] == 0 && i > 0 && j > 0 && i <= n && j <= m && mat[i][j] != 'D' && mat[i][j] != '*' && mat[i][j] != 'I');
}

inline void bfsinit()
{
    while (!q.empty())
    {
        int i = q.front().first;
        int j = q.front().second;
        maxim = max(maxim, d[i][j]);
        q.pop();
        for (int directie = 0; directie < 4; directie++)
        {
            int i1 = i + dx[directie];
            int j1 = j + dy[directie];
            if (d[i1][j1] == 0 && ok(i1, j1))
                d[i1][j1] = d[i][j] + 1, q.push({i1, j1});
        }
    }
}

inline void reset()
{
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            a[i][j] = 0;
}

inline bool bfs(int x)
{
    while (!q.empty())
        q.pop();
    q.push({start.first, start.second});
    reset();
    while (!q.empty())
    {
        int i = q.front().first;
        int j = q.front().second;
        if (i == stop.first && j == stop.second)
                    return true;
        q.pop();
        for (int directie = 0; directie < 4; directie++)
        {
            int i1 = i + dx[directie];
            int j1 = j + dy[directie];
            if (OK(i1, j1) && d[i1][j1] >= x)
            {
                q.push({i1, j1});
                a[i1][j1] = 1;
            }
        }
    }
    return false;
}

int main()
{
    read();
    bfsinit();
    int st = 0;
    int dr = maxim + 2;
    while (st <= dr)
    {
        int mij = (st + dr) / 2;
        if (bfs(mij))
            st = mij + 1, sol = mij;
        else
            dr = mij - 1;
    }
    bfs(sol);
    fout << sol;
    return 0;
}