Cod sursa(job #3316422)

Utilizator parrot279Sofi Tudose parrot279 Data 18 octombrie 2025 18:49:58
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.63 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[1002][1002], n, m, istart, jstart, ifin, jfin;
bool dragon[1002][1002];
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')
            {
                dragon[i][j] = true;
                q.push({i, j});
            }
        }
    }
    calculdragoni();

    int st = 1, dr = 2002, rez = 0;
    while(st <= dr)
    {
        int mijl = (st + dr) / 2;
        if(ajunge(mijl))
        {
            rez = mijl;
            st = mijl+1;
        }
        else
            dr = mijl - 1;
    }
    if(rez == 0)
        fout<<-1;
    else
        fout<<rez;



    return 0;
}




bool ajunge(int val)
{
    queue<pair<int, int>> coada;
    bool viz[1002][1002] = {};
    for(int i = 1; i <= n; ++i)
    {
        for(int j = 1; j <= m; ++j)
            viz[i][j] = false;
    }

    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] && !dragon[lin][col] && a[lin][col] > 0 && 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 && !dragon[lin][col])
            {
                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);
}