Cod sursa(job #3367587)

Utilizator Razvan23Razvan Mosanu Razvan23 Data 8 octombrie 2026 18:47:06
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.01 kb
#include <bits/stdc++.h>

int dx[] = {-1,1,0,0};
int dy[] = {0,0,-1,1};

bool Interior(int i, int j, int N, int M)
{
    if(i <= 0 || i > N) return false;
    if(j <= 0 || j > M) return false;
    return true;
}

void LEE(std::queue<std::pair<int, int>>& q, std::vector<std::vector<int>>& L)
{
    int n = L.size() - 1;
    int m = L[0].size() - 1;
    while(!q.empty())
    {
        int x = q.front().first;
        int y = q.front().second;
        q.pop();
        for(int l = 0; l < 4; l++)
        {
            int xx = x + dx[l];
            int yy = y + dy[l];
            if(Interior(xx, yy, n, m) && L[xx][yy] > 0 && L[xx][yy] > L[x][y] + 1)
            {
                L[xx][yy] = L[x][y] + 1;
                q.push({xx, yy});
            }
        }
    }
}

bool Verifica(int limita, std::pair<int, int> start, std::pair<int, int> finish, const std::vector<std::vector<int>>& L, int N, int M)
{
    if (L[start.first][start.second] < limita || L[finish.first][finish.second] < limita)  return false;
    std::queue<std::pair<int, int>> q;
    std::vector<std::vector<bool>> viz(N + 1, std::vector<bool>(M + 1, false));
    q.push(start);
    viz[start.first][start.second] = true;
    while(!q.empty())
    {
        int x = q.front().first;
        int y = q.front().second;
        q.pop();
        if (x == finish.first && y == finish.second) return true; 
        for(int l = 0; l < 4; l++)
        {
            int xx = x + dx[l];
            int yy = y + dy[l];
            if (Interior(xx, yy, N, M) && !viz[xx][yy] && L[xx][yy] >= limita)
            {
                viz[xx][yy] = true;
                q.push({xx, yy});
            }
        }
    }
    return false; 
}

int main()
{
    std::ifstream fin("barbar.in");
    std::ofstream fout("barbar.out");
    int N{}, M{}, i{}, j{};
    fin >> N >> M;
    std::vector<std::vector<int>> L(N+1, std::vector<int>(M+1));
    std::string s;
    std::queue<std::pair<int, int>> q;
    std::pair<int, int> start{}, finish{};
    for(i = 1; i <= N; i++)
    {
        fin >> s;
        for(j = 0; j < M; j++)
        {
            if(s[j] == '.') L[i][j + 1] = 2e9;
            else if(s[j] == 'D')
            {
                L[i][j + 1] = 0;
                q.push({i, j + 1});
            }
            else if(s[j] == '*') L[i][j + 1] = -1;
            else if(s[j] == 'I') 
            {
                start = {i, j + 1};
                L[i][j + 1] = 2e9;
            }
            else if(s[j] == 'O')
            {
                finish = {i, j + 1};
                L[i][j + 1] = 2e9;
            }
        }
    }
    LEE(q, L);
    int st = 0; 
    int dr = N + M;
    int ans = -1;
    while(st <= dr)
    {
        int mij = (st + dr) / 2;
        if (Verifica(mij, start, finish, L, N, M))
        {
            ans = mij;      
            st = mij + 1;   
        }
        else dr = mij - 1; 
    }
    fout << ans << "\n";
    fin.close();
    fout.close();
    return 0;
}