Cod sursa(job #3353369)

Utilizator cristiz123456Zoescu Cristian cristiz123456 Data 6 mai 2026 16:12:55
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.63 kb
#include <bits/stdc++.h>

using namespace std;
const int N = 1000;
int dist[N + 1][N + 1], mers[N + 1][N + 1];
char v[N + 1][N + 1];
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};
int n, m, xo, yo, xi, yi;
queue <pair <int, int> > q;
int i, j, x, y, st, dr, mij, rez;
bool is_ok(int i, int j)
{
    if(i > 0 && i <= n && j > 0 && j <= m && dist[i][j] == 0 && v[i][j] != '*')
        return true;
    return false;
}
bool is_ok1(int i, int j, int mij)
{
    if(i > 0 && i <= n && j > 0 && j <= m && mers[i][j] == 0 && dist[i][j] >= mij && v[i][j] != '*')
        return true;
    return false;
}
bool check(int distanta)
{
    for(i = 1; i <= n; i++)
    {
        for(j = 1; j <= m; j++)
        {
            mers[i][j] = 0;
        }
    }
    q.push(make_pair(xo, yo));
    while(!q.empty())
    {
        i = q.front().first;
        j = q.front().second;
        q.pop();
        for(int d = 0; d < 4; d++)
        {
            x = i + dx[d];
            y = j + dy[d];
            if(is_ok1(x, y, distanta))
            {
                mers[x][y] = mers[i][j] + 1;
                q.push(make_pair(x, y));
            }
        }
    }
    if(mers[xi][yi] > 0)
        return true;
    return false;
}
int main()
{
    ifstream cin("barbar.in");
    ofstream cout("barbar.out");
    cin >> n >> m;
    for(i = 1; i <= n; i++)
    {
        cin.get();
        for(j = 1; j <= m; j++)
        {
            v[i][j] = cin.get();
            if(v[i][j] == 'D')
            {
                q.push(make_pair(i, j));
            }
            else if(v[i][j] == 'O')
            {
                xo = i;
                yo = j;
            }
            else if(v[i][j] == 'I')
            {
                xi = i;
                yi = j;
            }
        }
    }
    while(!q.empty())
    {
        i = q.front().first;
        j = q.front().second;
        q.pop();
        for(int d = 0; d < 4; d++)
        {
            x = i + dx[d];
            y = j + dy[d];
            if(is_ok(x, y))
            {
                dist[x][y] = dist[i][j] + 1;
                q.push(make_pair(x, y));
            }
        }
    }
    /*for(i = 1; i <= n; i++)
    {
        for(j = 1; j <= m; j++)
        {
            printf("%d ",dist[i][j]);
        }
        printf("\n");
    }*/
    st = 0;
    dr = n;
    while(st <= dr)
    {
        mij = (st + dr) / 2;
        if(check(mij))
        {
            rez = mij;
            st = mij + 1;
        }
        else
        {
            dr = mij - 1;
        }
    }
    cout << rez;
    return 0;
}