Cod sursa(job #3274918)

Utilizator S10fanTataru Stefan S10fan Data 8 februarie 2025 13:39:47
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.59 kb
#include <bits/stdc++.h>
using namespace std;

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

int n, m, d[1003][1003];
char a[1003][1003];
bitset<1003> viz[1003];
int xi, yi, xo, yo;
queue< pair<int, int> > q;
int dx[] = {0,0,-1,1};
int dy[] = {-1,1,0,0};

void Citire()
{
    int i, j;
    string s;
    fin >> n >> m;
    for (i = 1; i <= n; i++)
    {
        fin >> s;
        for (j = 0; j < m; j++)
        {
            a[i][j + 1] = s[j];
            if (s[j] == 'I')
            {
                xi = i; yi = j + 1;
            }
            else if (s[j] == 'O')
            {
                xo = i; yo = j + 1;
            }
        }
    }
}

void Bordare()
{
    int i, j;
    /// coloanele 0 si m + 1
    for (i = 0; i <= n + 1; i++)
        a[i][0] = a[i][m + 1] = '*';
    /// liniile 0 si n + 1
    for (j = 0; j <= m + 1; j++)
        a[0][j] = a[n + 1][j] = '*';
}

void Lee()
{
    int i, j, x, y, p;
    for (i = 1; i <= n; i++)
        for (j = 1; j <= m; j++)
        {
            d[i][j] = 2000000;
            if (a[i][j] == 'D')
            {
                q.push({i,j});
                d[i][j] = 0;
            }
        }
    while (!q.empty())
    {
        i = q.front().first;
        j = q.front().second;
        q.pop();
        for (p = 0; p < 4; p++)
        {
            x = i + dx[p];
            y = j + dy[p];
            if (a[x][y] != '*' && d[x][y] > d[i][j] + 1)
            {
                d[x][y] = 1 + d[i][j];
                q.push({x, y});
            }
        }
    }
}

bool Fill(int dist)
{
    int i, j, x, y, p;
    for(i = 1; i <= n; i++)
        viz[i].reset();
    stack < pair<int, int> > st;
    st.push({xi, yi});
    viz[xi][yi] = 1;
    while(!st.empty())
    {
        i = st.top().first;
        j = st.top().second;
        st.pop();
        for(p = 0; p < 4; p++)
        {
            x = i + dx[p];
            y = j + dy[p];
            if(a[x][y] != '*' && !viz[x][y] && d[x][y] >= dist)
            {
                viz[x][y] = 1;
                st.push({x, y});
            }
        }
    }
    if(viz[xo][yo] == 1) return true;
    return false;
}

void CB()
{
    int st, dr, mij, dist = -1;
    st = 1;
    dr = min(d[xi][yi], d[xo][yo]);
    while(st <= dr)
    {
        mij = (st + dr) / 2;
        if(Fill(mij))
        {
            dist = mij;
            st = mij + 1;
        }
        else dr = mij - 1;
    }
    fout << dist;
}

int main()
{
    Citire();
    Bordare();
    Lee();
    CB();
    return 0;
}