Cod sursa(job #3265147)

Utilizator tudorvoieVoie Tudor tudorvoie Data 27 decembrie 2024 13:22:31
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda oji_10_2024 Marime 2.58 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <queue>
using namespace std;

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

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

char grid[1000][1000];
int dist_dragon[1000][1000];
bool vizitat[1000][1000];
int r, c, si, sj, ei, ej;

bool verificare(int nx, int ny) {
    return nx >= 0 && nx < r && ny >= 0 && ny < c && grid[nx][ny] != '*';
}

bool valid(int min_dist)
{
    queue<pair<int, int>> q;

    for (int i = 0; i < r; i++)
        for (int j = 0; j < c; j++)
            vizitat[i][j] = false;

    q.push({si, sj});
    vizitat[si][sj] = true;

    while (!q.empty())
    {
        int x = q.front().first, y = q.front().second;
        q.pop();

        if (x == ei && y == ej)
            return true;

        for (int k = 0; k < 4; k++)
        {
            int nx = x + dx[k], ny = y + dy[k];
            if (verificare(nx, ny) && !vizitat[nx][ny] && dist_dragon[nx][ny] >= min_dist)
            {
                vizitat[nx][ny] = true;
                q.push({nx, ny});
            }
        }
    }

    return false;
}

int main()
{
    fin >> r >> c;
    for (int i = 0; i < r; i++)
    {
        for (int j = 0; j < c; j++)
        {
            fin >> grid[i][j];
            if (grid[i][j] == 'I')
            {
                si = i;
                sj = j;
            }
            else if (grid[i][j] == 'O')
            {
                ei = i;
                ej = j;
            }
        }
    }

    queue<pair<int, int>> q;

    for (int i = 0; i < r; i++)
    {
        for (int j = 0; j < c; j++)
        {
            dist_dragon[i][j] = -1;
            if (grid[i][j] == 'D')
            {
                q.push({i, j});
                dist_dragon[i][j] = 0;
            }
        }
    }

    while (!q.empty())
    {
        int x = q.front().first, y = q.front().second;
        q.pop();
        for (int k = 0; k < 4; k++)
        {
            int nx = x + dx[k], ny = y + dy[k];
            if (verificare(nx, ny) && dist_dragon[nx][ny] == -1)
            {
                dist_dragon[nx][ny] = dist_dragon[x][y] + 1;
                q.push({nx, ny});
            }
        }
    }

    int st = 0, dr = 1000, rasp = -1;
    while (st <= dr)
    {
        int mij = (st + dr) / 2;
        if (valid(mij))
        {
            rasp = mij;
            st = mij + 1;
        }
        else
        {
            dr = mij - 1;
        }
    }

    fout << rasp;
    return 0;
}