Cod sursa(job #2785909)

Utilizator cristia_razvanCristia Razvan cristia_razvan Data 19 octombrie 2021 20:11:50
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.33 kb
#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;
}