Cod sursa(job #2954959)

Utilizator AlexandruIoan20Moraru Ioan Alexandru AlexandruIoan20 Data 15 decembrie 2022 20:54:28
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.74 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;

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

int R, C, xo, yo, xi, yi;
int d[1004][1004];

queue<pair<int, int>> q;
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};
vector<vector<int>> v;

void citire()
{
    char c;
    v.resize(1004);
    for (int i = 0; i < 1003; i++)
    {
        v[i].resize(1004);
    }
    fin >> R >> C;
    for (int i = 0; i < R; i++)
        for (int j = 0; j < C; j++)
        {
            fin >> c;
            if (c == 'I')
            {
                xi = i;
                yi = j;
            }

            if (c == 'O')
            {
                xo = i;
                yo = j;
            }

            if (c == 'D')
            {
                q.push({i, j});
                d[i][j] = 1;
            }

            if (c == '*')
            {
                d[i][j] = -1;
            }
        }
}

bool inmat(int i, int j)
{
    if (!(i >= 0 && j >= 0))
        return false;

    if (!(i < R && j < C))
        return false;

    return true;
}

void initializare()
{
    while (!q.empty())
        q.pop();

    v.clear();
    v.resize(1004);
    for (int i = 0; i < 1003; i++)
        v[i].resize(1004);
}

void leeD()
{
    int x, y, vx, vy;
    while (q.empty() == false)
    {
        x = q.front().first;
        y = q.front().second;

        for (int k = 0; k < 4; k++)
        {
            vx = x + dx[k];
            vy = y + dy[k];
            if (inmat(vx, vy) && d[vx][vy] == 0)
            {
                d[vx][vy] = d[x][y] + 1;
                q.push({vx, vy});
            }
        }
        q.pop();
    }
}

bool lee(int k)
{
    int x, y, vx, vy;

    q.push({xi, yi});
    v[xi][yi] = 1;
    while (q.empty() == false)
    {
        x = q.front().first;
        y = q.front().second;

        for (int dir = 0; dir < 4; dir++)
        {
            vx = x + dx[dir];
            vy = y + dy[dir];
            if (inmat(vx, vy) && d[vx][vy] > k && v[vx][vy] == 0)
            {
                q.push({vx, vy});
                v[vx][vy] = 1;
            }
        }
        q.pop();
        if (v[xo][yo] == 1)
        {
            return true;
        }
    }

    return false;
}

int cb()
{
    int st = 1, dr, mid, sol = -1;
    dr = min(d[xi][yi], d[xo][yo]) - 1;

    while (st <= dr)
    {
        mid = (st + dr) / 2;
        initializare();
        if (lee(mid))
        {
            sol = mid;
            st = mid + 1;
        }

        else
            dr = mid - 1;
    }

    return sol;
}

int main()
{
    citire();
    leeD();
    fout << cb();

    return 0;
}