Cod sursa(job #2823449)

Utilizator bananamandaoneTudor Cosmin Oanea bananamandaone Data 28 decembrie 2021 15:34:37
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.66 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, m, istart, jstart, istop, jstop;
vector< vector<int> > a, viz;
queue< pair<int, int> > q;
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};

void citire()
{
    char x;
    fin >> n >> m;
    a.resize(n);
    for(int i = 0; i < n; i++)
        a[i].resize(m);

    for(int i = 0; i < n; i++)
        for(int j = 0; j < m; j++)
        {
            fin >> x;

            if(x == 'I')
            {
                istart = i;
                jstart = j;
            }
            else if(x == 'O')
            {
                istop = i;
                jstop = j;
            }
            else if(x == 'D')
            {
                q.push({i, j});
                a[i][j] = 1;
            }
            else if(x == '*')
                a[i][j] = -1;
        }
}

void viz_q_init()
{
    viz.clear();
    viz.resize(n);
    for(int i = 0; i < n; i++)
        viz[i].resize(m);

    while(!q.empty())
        q.pop();
}

bool inmatr(int i, int j)
{
    return (i >= 0) && (j >= 0) && (i < n) && (j < m);
}

void lee_dragon()
{
    pair<int, int> w;
    while(!q.empty())
    {
        w = q.front();
        q.pop();

        for(int dir = 0; dir < 4; dir++)
        {
            int ii = w.first + dx[dir];
            int jj = w.second + dy[dir];

            if(inmatr(ii, jj) && a[ii][jj] == 0)
            {
                a[ii][jj] = a[w.first][w.second] + 1;
                q.push({ii, jj});
            }
        }
    }
}

bool lee(int k)
{
    pair<int, int> w;

    viz[istart][jstart] = 1;
    q.push({istart, jstart});

    while(!q.empty())
    {
        w = q.front();
        q.pop();

        for(int dir = 0; dir < 4; dir++)
        {
            int ii = w.first + dx[dir];
            int jj = w.second + dy[dir];
            if(inmatr(ii, jj) && k < a[ii][jj] && viz[ii][jj] == 0)
            {
                q.push({ii, jj});
                viz[ii][jj] = 1;
            }
        }
        if(viz[istop][jstop] == 1)
            return true;
    }
    return false;
}

int caut_bin()
{
    int st = 1, dr, mij, sol = -1;
    dr = min(a[istart][jstart], a[istop][jstop]) - 1;

    while(st <= dr)
    {
        mij = st + (dr - st) / 2;

        viz_q_init();
        if(lee(mij))
        {
            sol = mij;
            st = mij + 1;
        }
        else dr = mij - 1;
    }

    return sol;
}

int main()
{
    citire();
    lee_dragon();
    fout << caut_bin() << "\n";

    fin.close();
    fout.close();
    return 0;
}