Cod sursa(job #2960966)

Utilizator Ruxandra009Ruxandra Vasilescu Ruxandra009 Data 5 ianuarie 2023 13:59:08
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.34 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int n, m, pi, pj, sol = -1, st, dr, mid, ii, ij;
int A[1005][1005], viz[1005][1005];
char x;
queue< pair<int, int> > Q;
bool verif(int lin, int col)
{
    return (lin >= 1 && lin <= n && col >= 1 && col <= m );
}
bool solution(int middle)
{
    int l, c, il, ic;
    int dl[4] = {0, 0, 1, -1};
    int dc[4] = {1, -1, 0, 0};

    Q.push({pi, pj});
    viz[pi][pj] = 1;

    while(!Q.empty())
    {
        l = Q.front().first;
        c = Q.front().second;
        for(int i = 0; i < 4; i ++)
        {
            il = l + dl[i];
            ic = c + dc[i];
            if(verif(il, ic) && viz[il][ic] == 0 && A[il][ic] - 1 >= middle)
            {
                viz[il][ic] = 1;
                Q.push({il, ic});
            }
        }
        Q.pop();
    }

    if(viz[ii][ij] == 1)return true;
    return false;
}
void Lee()
{
    int l, c, il, ic;
    int dl[4] = {0, 0, 1, -1};
    int dc[4] = {1, -1, 0, 0};
    while(!Q.empty())
    {
        l = Q.front().first;
        c = Q.front().second;
        for(int i = 0; i < 4; i ++)
        {
            il = l + dl[i];
            ic = c + dc[i];
            if(verif(il, ic) && A[il][ic] == 0)
            {
                A[il][ic] = A[l][c] + 1;
                Q.push({il, ic});
            }
        }
        Q.pop();
    }
}
int main()
{
    f >> n >> m;
    for(int i = 1; i <= n; i ++)
        for(int j = 1; j <= m; j ++)
        {
            f >> x;
            if(x == 'I')
            {
                pi = i;
                pj = j;
            }

            else if(x == '*')
                A[i][j] = -1;

            else if(x == 'D')
            {
                A[i][j] = 1;
                Q.push({i, j});
            }

            else if(x == 'O')
            {
                ii = i;
                ij = j;
            }
        }
    Lee();

    st = 1; dr = n * m;
    while(st <= dr)
    {
        mid = (st + dr) / 2;
        if(solution(mid))
        {
            sol = mid;
            st = mid + 1;
        }
        else dr = mid - 1;

        for(int i = 1; i <= n; i ++)
            for(int j = 1; j <= m; j ++)
                viz[i][j] = 0;
    }

    g << sol;
    return 0;
}