Cod sursa(job #3313511)

Utilizator Roberto_CChirvasitu Roberto Roberto_C Data 4 octombrie 2025 21:49:08
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.52 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("barbar.in");
ofstream fout("barbar.out");

const int dx[] = {-1,0,1,0};
const int dy[] = {0,1,0,-1};
const int MAXN = 1001;
int n, m;
char a[MAXN][MAXN];
int dragon_dist[MAXN][MAXN];

pair<int,int> start, exit_;

void compute_dragon_dist()//distanta de la dragoni la puncte
{
    queue<pair<int,int>> q;
    for(int i = 0; i < n; i++)
        for(int j = 0; j < m; j++)
            dragon_dist[i][j] = -1;

    for(int i = 0; i < n; i++)
        for(int j = 0; j < m; j++)
            if(a[i][j] == 'D')
            {
                q.push({i,j});
                dragon_dist[i][j] = 0;
            }

    while(!q.empty())
    {
        auto [x,y] = q.front();
        q.pop();
        for(int d = 0; d < 4; d++)
        {
            int nx = x + dx[d];
            int ny = y + dy[d];
            if(nx >= 0 && ny >= 0 && nx < n && ny < m && a[nx][ny] != '*' && dragon_dist[nx][ny] == -1)
            {
                dragon_dist[nx][ny] = dragon_dist[x][y] + 1;
                q.push({nx, ny});
            }
        }
    }
}

bool can_escape(int min_dist)
{
    if(dragon_dist[start.first][start.second] < min_dist)
        return false;
    vector<vector<bool>> vis(n+1,vector<bool>(m,false));
    queue<pair<int,int>> q;
    q.push(start);
    vis[start.first][start.second] = true;
    while(!q.empty())
    {
        auto [x,y] = q.front();
        q.pop();
        if(x == exit_.first && y == exit_.second)
            return true;
        for(int d = 0; d < 4; d++)
        {
            int nx = x + dx[d];
            int ny = y + dy[d];
            if(nx >= 0 && ny >= 0 && nx < n && ny < m && !vis[nx][ny] && a[nx][ny] != '*' && dragon_dist[nx][ny] >= min_dist)
            {
                vis[nx][ny] = true;
                q.push({nx, ny});
            }
        }
    }
    return false;
}

int main()
{
    fin >> n >> m;
    for(int i = 0; i < n; i++)
    {
        fin >> a[i];
        for(int j = 0; j < m; j++)
        {
            if(a[i][j] == 'I')
                start = {i,j};
            if(a[i][j] == 'O')
                exit_ = {i,j};
        }
    }

    compute_dragon_dist();
    int st = 0, dr = n + m, ans = -1;
    while(st <= dr)
    {
        int mid = (st + dr)/2;
        if(can_escape(mid))
        {
            ans = mid;
            st = mid + 1;
        }
        else
        {
            dr = mid - 1;
        }
    }
    fout << ans;
    return 0;
}