Cod sursa(job #3341806)

Utilizator IlinaRazvanIlina Razvan Alexandru IlinaRazvan Data 21 februarie 2026 11:08:38
Problema Barbar Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.05 kb
#include <fstream>
#include <queue>
#include <cstring>
using namespace std;

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

const int NMAX = 255;

int n, m;
int sx, sy, ex, ey;

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

int dist[NMAX + 2][NMAX + 2];
bool VIZ[NMAX + 2][NMAX + 2];
char grid[NMAX + 2][NMAX + 2];

queue<pair<int,int>> q;
pair<int,int> aux, nou;

bool valid(int x)
{
    while(!q.empty()) q.pop();
    memset(VIZ, 0, sizeof(VIZ));

    if(dist[sx][sy] < x)
        return false;

    q.push({sx, sy});
    VIZ[sx][sy] = true;

    while(!q.empty())
    {
        aux = q.front();
        q.pop();

        if(aux.first == ex && aux.second == ey)
            return true;

        for(int dir = 0; dir < 4; dir++)
        {
            nou.first = aux.first + dx[dir];
            nou.second = aux.second + dy[dir];

            if(nou.first >= 1 && nou.first <= n &&
               nou.second >= 1 && nou.second <= m &&
               !VIZ[nou.first][nou.second] &&
               grid[nou.first][nou.second] != '*' &&
               dist[nou.first][nou.second] >= x)
            {
                VIZ[nou.first][nou.second] = true;
                q.push(nou);
            }
        }
    }

    return false;
}

int main()
{
    fin >> n >> m;

    for(int i = 1; i <= n; i++)
    {
        char s[NMAX + 2];
        fin >> s;

        for(int j = 1; j <= m; j++)
        {
            grid[i][j] = s[j-1];

            if(grid[i][j] == 'I')
            {
                sx = i;
                sy = j;
            }
            if(grid[i][j] == 'O')
            {
                ex = i;
                ey = j;
            }
        }
    }
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            dist[i][j] = -1;

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

    while(!q.empty())
    {
        aux = q.front();
        q.pop();

        for(int dir = 0; dir < 4; dir++)
        {
            nou.first = aux.first + dx[dir];
            nou.second = aux.second + dy[dir];

            if(nou.first >= 1 && nou.first <= n &&
               nou.second >= 1 && nou.second <= m &&
               (grid[nou.first][nou.second] == '.' ||
                grid[nou.first][nou.second] == 'I' ||
                grid[nou.first][nou.second] == 'O') &&
               dist[nou.first][nou.second] == -1)
            {
                dist[nou.first][nou.second] =
                    dist[aux.first][aux.second] + 1;
                q.push(nou);
            }
        }
    }

    int last = 0;
    int st = 0;
    int dr = dist[ex][ey];
    int mij;

    while(st <= dr)
    {
        mij = (st + dr) / 2;

        if(valid(mij))
        {
            last = mij;
            st = mij + 1;
        }
        else
            dr = mij - 1;
    }

    fout << last;

    return 0;
}