Cod sursa(job #3316417)

Utilizator parrot279Sofi Tudose parrot279 Data 18 octombrie 2025 18:41:12
Problema Barbar Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.58 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("barbar.in");
ofstream fout("barbar.out");
void calculdragoni();
bool ajunge(int val);
bool inmatrice(int i, int j);
int dirL[4] = {-1, 0, 1, 0}, dirC[4] = {0, 1, 0, -1};

int a[1001][1001], n, m, istart, jstart, ifin, jfin;
queue<pair<int, int>> q;

int main()
{

    fin>>n>>m;
    for(int i = 1; i <= n; ++i)
    {
        fin.get();
        for(int j = 1; j <= m; ++j)
        {
            char c;
            fin.get(c);
            if(c == '*')
                a[i][j] = -1;
            else if(c == 'I')
            {
                istart = i; jstart = j;
            }
            else if(c == 'O')
            {
                ifin = i; jfin = j;
            }
            else if(c == 'D')
            {
                a[i][j] = 1;
                q.push({i, j});
            }
        }
    }
    calculdragoni();
//    for(int i = 1; i <= n; ++i)
//    {
//        for(int j = 1; j <= m; ++j)
//            cout<<a[i][j]<<" ";
//        cout<<"\n";
//    }
    int st = 1, dr = 1e6+1, rez;
    while(st <= dr)
    {
        int mijl = (st + dr) / 2;
        if(ajunge(mijl))
        {
            rez = mijl;
            st = mijl+1;
        }
        else
            dr = mijl - 1;
    }
    if(rez == 1)
        fout<<-1;
    else
        fout<<rez-1;



    return 0;
}

bool ajunge(int val)
{
    queue<pair<int, int>> coada;
    bool viz[1001][1001];

    viz[istart][jstart] = 1;
    coada.push({istart, jstart});
    while(!coada.empty())
    {
        int l = coada.front().first, c = coada.front().second;
        coada.pop();
        for(int k = 0; k <= 3; ++k)
        {
            int lin = l + dirL[k], col = c + dirC[k];
            if(inmatrice(lin, col) && !viz[lin][col] && a[lin][col] > 1 && a[lin][col] >= val)
            {
                if(lin == ifin && col == jfin)
                    return true;
                viz[lin][col] = 1;
                coada.push({lin, col});
            }
        }

    }
    return false;

}

void calculdragoni()
{
    while(!q.empty())
    {
        int l = q.front().first, c = q.front().second;
        q.pop();
        for(int k = 0; k <= 3; ++k)
        {
            int lin = l + dirL[k], col = c + dirC[k];
            if(inmatrice(lin, col) && a[lin][col] == 0)
            {
                a[lin][col] = a[l][c] + 1;
                q.push({lin, col});
            }
        }
    }
}

bool inmatrice(int i, int j)
{
    return (1 <= i && 1 <= j && i <= n && j <= m);
}