Cod sursa(job #3310517)

Utilizator AndreiCod123Sitaru Mircea AndreiCod123 Data 14 septembrie 2025 15:42:20
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.1 kb
#include <bits/stdc++.h>
using namespace std;

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

const int NMAX = 1005;
const int dx[] = {0, 0, -1, 1};
const int dy[] = {-1, 1, 0, 0};
const int INF = 1e9;

int n, m, i, j;
int mat[NMAX][NMAX], le[NMAX][NMAX];
char cr;
queue<pair<int,int>> q;

void lee1()
{
    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(nx >= 1 && nx <= n && ny >= 1 && ny <= m &&
                    mat[nx][ny] != 0 && le[nx][ny] > le[x][y] + 1)
            {
                le[nx][ny] = le[x][y] + 1;
                q.push({nx, ny});
            }
        }
    }
}


bool lee2(int val, pair<int,int> start, pair<int,int> exit)
{
    vector<vector<bool>> visited(n+1, vector<bool>(m+1,false));
    queue<pair<int,int>> qq;
    qq.push(start);
    visited[start.first][start.second] = true;

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

        if(x == exit.first && y == exit.second)
            return true;

        for(int k = 0; k < 4; k++)
        {
            int nx = x + dx[k], ny = y + dy[k];
            if(nx >= 1 && nx <= n && ny >= 1 && ny <= m &&
                    !visited[nx][ny] && mat[nx][ny] != 0 && le[nx][ny] >= val)
            {
                visited[nx][ny] = true;
                qq.push({nx, ny});
            }
        }
    }
    return false;
}


int maxdist()
{
    int mx = 0;
    for(i = 1; i <= n; i++)
        for(j = 1; j <= m; j++)
            if(le[i][j] < INF)
                mx = max(mx, le[i][j]);
    return mx;
}


int cautbin(pair<int,int> start, pair<int,int> exit)
{
    int st = 0, dr = maxdist(), rasp = -1;
    while(st <= dr)
    {
        int mid = (st + dr)/2;
        if(lee2(mid, start, exit))
        {
            rasp = mid;
            st = mid + 1;
        }
        else
            dr = mid - 1;
    }
    return rasp;
}

int main()
{
    pair<int,int> start, exit;

    fin >> n >> m;
    for(i = 1; i <= n; i++)
    {
        for(j = 1; j <= m; j++)
        {
            fin >> cr;
            switch(cr)
            {
            case '.':
                mat[i][j] = -1;
                le[i][j] = INF;
                break;
            case 'I':
                mat[i][j] = -1;
                le[i][j] = INF;
                start = {i,j};
                break;
            case 'O':
                mat[i][j] = -1;
                le[i][j] = INF;
                exit = {i,j};
                break;
            case 'D':
                mat[i][j] = -2;
                le[i][j] = 0;
                q.push({i,j});
                break;
            case '*':
                mat[i][j] = 0;
                le[i][j] = -1;
                break;
            }
        }
    }

    lee1();
    int raspuns = cautbin(start, exit);
    fout << raspuns;

    fin.close();
    fout.close();
    return 0;
}