Cod sursa(job #3151717)

Utilizator BuzdiBuzdugan Rares Andrei Buzdi Data 22 septembrie 2023 17:30:58
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.43 kb
#include <fstream>
#include <map>
#include <vector>
#include <queue>
using namespace std;

ifstream cin("barbar.in");
ofstream cout("barbar.out");

const int NMAX = 1000; 

const int di[] = {0, 0, 1, -1};
const int dj[] = {1, -1, 0, 0};

int n, m;
int a[NMAX + 1][NMAX + 1];
int istart, jstart, ifinal, jfinal;
int leeD[NMAX + 1][NMAX + 1];
int lee[NMAX + 1][NMAX + 1];
queue<pair<int, int>> Q;

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

void LeeD()
{
    while(!Q.empty())
    {
        int i = Q.front().first;
        int j = Q.front().second;
        Q.pop();

        for(int d = 0; d < 4; d++)
        {
            int inou = i + di[d];
            int jnou = j + dj[d];

            if(InMat(inou, jnou) && !a[inou][jnou] && !leeD[inou][jnou])
            {
                leeD[inou][jnou] = leeD[i][j] + 1;
                Q.push({inou, jnou});
            }
        }
    }
}

bool Check(int distance)
{
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            lee[i][j] = 0;
    
    queue<pair<int, int>> Q;
    lee[istart][jstart] = 1;
    Q.push({istart, jstart});
    while(!Q.empty())
    {
        int i = Q.front().first;
        int j = Q.front().second;
        Q.pop();

        for(int d = 0; d < 4; d++)
        {
            int inou = i + di[d];
            int jnou = j + dj[d];

            if(InMat(inou, jnou) && !a[inou][jnou] && !lee[inou][jnou] && leeD[inou][jnou] - 1 >= distance)
            {
                lee[inou][jnou] = lee[i][j] + 1;
                Q.push({inou, jnou});
            }
        }
    }

    return (lee[ifinal][jfinal] != 0);
}

int main()
{
    cin >> n >> m;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
        {
            char x;
            cin >> x;
            if(x == '*')
                a[i][j] = 1;
            else if(x == 'I')
                istart = i, jstart = j;
            else if(x == 'O')
                ifinal = i, jfinal = j;
            else if(x == 'D')
            {
                leeD[i][j] = 1;
                Q.push({i, j});
            }
        }

    LeeD();

    int st = 0, dr = 3 * n, ans = -1;
    while(st <= dr)
    {
        int mij = (st + dr) / 2;
        if(Check(mij))
            ans = mij, st = mij + 1;
        else
            dr = mij - 1;
    }
    cout << ans;
    return 0;
}