Cod sursa(job #3134482)

Utilizator TeodoraMaria123Serban Teodora Maria TeodoraMaria123 Data 29 mai 2023 09:17:27
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.02 kb
#include <bits/stdc++.h>

using namespace std;

#define pb push_back
const int MAX_N = 1005;
const int di[] = {0, 0, 1, -1};
const int dj[] = {1, - 1, 0, 0};

int n, m, startI, startJ, finishI, finishJ;
int a[MAX_N + 1][MAX_N + 1], b[MAX_N + 1][MAX_N + 1];
queue <pair <int, int > > q, dragonQueue;

void print()
{
    for(int i = 1; i <= n; i ++)
    {
        for(int j = 1; j <= m; j ++)
            cout << b[i][j] << " ";
        cout << "\n";
    }
    cout << "\n";
}

void borderMatrix()
{
    for(int i = 1; i <= n; i ++)
        b[i][0] = b[i][m + 1] = -1;
    for(int j = 1; j <= m; j ++)
        b[0][j] = b[n + 1][j] = -1;
}

void regenerateBoard(int radius)
{
    for(int i = 1; i <= n; i ++)
        for(int j = 1; j <= m; j ++)
        {
            b[i][j] = a[i][j];
            if(a[i][j] == -2)
                dragonQueue.push({i, j});
        }

    while(!dragonQueue.empty())
    {
        int i, j;
        i = dragonQueue.front().first;
        j = dragonQueue.front().second;
        dragonQueue.pop();
        for(int k = 0; k < 4; k ++)
            if(b[i + di[k]][j + dj[k]] == 0  &&  -b[i][j] < radius + 1)
            {
                b[i + di[k]][j + dj[k]] = b[i][j] - 1;
                dragonQueue.push({i + di[k], j + dj[k]});
            }
    }
}

bool solve()
{
    if(b[startI][startJ])
        return  0;

    b[startI][startJ] = 1;
    q.push({startI,startJ});

    while(!q.empty())
    {
        int i, j;
        i = q.front().first;
        j = q.front().second;
        q.pop();
        for(int k = 0; k < 4; k ++)
            if(b[i + di[k]][j + dj[k]] == 0)
            {
                b[i + di[k]][j + dj[k]] = b[i][j] + 1;
                q.push({i + di[k], j + dj[k]});
            }
    }
    return b[finishI][finishJ] > 0;
}

bool ok(int radius)
{

    regenerateBoard(radius);
    return solve();
}

int bs()
{
    int st = 1, dr = n * m, med, last = -1;
    while(st <= dr)
    {
        med = (st + dr) / 2;
        if(ok(med))
        {
            st = med + 1;
            last = med;
        }
        else
            dr = med - 1;
    }
    return last;
}


int main()
{
    ios_base :: sync_with_stdio(0);
    cin.tie(0);

    freopen("barbar.in", "r", stdin);
    freopen("barbar.out", "w", stdout);

    cin >> n >> m;
    borderMatrix();
    for(int i = 1; i <= n; i ++)
    {
        for(int j = 1; j <= m; j ++)
        {
            char ch;
            cin >> ch;
            if(ch == 'I')
            {
                startI = i;;
                startJ = j;
            }
            else if(ch == 'O')
            {
                finishI = i;
                finishJ = j;
            }
            else if(ch == '*')
            {
                a[i][j] = -1;
                b[i][j] = -1;
            }
            else if(ch == '.')
                a[i][j] = 0;
            else
                a[i][j] = -2;
        }
    }

    cout << bs();
    return 0;
}