Cod sursa(job #3307656)

Utilizator tomavladnicolae@gmail.comTomavlad [email protected] Data 22 august 2025 15:47:13
Problema Barbar Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.21 kb
#include <bits/stdc++.h>

using namespace std;

pair<int, int> v[1000005];
char a[1005][1005];
int b[1005][1005], n, m, k;
int xi, yi, xo, yo;
bitset<1003> c[1003];
ifstream fin("barbar.in");
ofstream fout("barbar.out");

void Citire()
{
    fin >> n >> m;
    for (int i = 1; i <= n; i++)
        fin >> a[i];
}

void Bordare()
{
    int i;
    for (i = 0; i <= n + 1; i++)
        a[i][0] = a[i][m + 1] = '*';
    for (i = 0; i <= m + 1; i++)
        a[0][i] = a[n + 1][i] = '*';
}

void Initial()
{
    int i, j;
    for (i = 1; i <= n; i++)
        for (j = 1; j <= m; j++)
        {
            if (a[i][j] == 'I') { xi = i; yi = j; }
            if (a[i][j] == 'O') { xo = i; yo = j; }
            if (a[i][j] == 'D')
            {
                b[i][j] = 0;
                k++;
                v[k] = { i, j }; 
            }
            else b[i][j] = 2000000;
        }
}

void Distante()
{
    int i, j, x, y;
    while (k > 0)
    {
        i = v[k].first;
        j = v[k].second;
        k--;
        /// nord:
        x = i - 1;
        y = j;
        if (a[x][y] != '*' && b[x][y] > 1 + b[i][j])
        {
            b[x][y] = 1 + b[i][j];
            k++;
            v[k] = { x, y };
        }
        /// sud:
        x = i + 1;
        y = j;
        if (a[x][y] != '*' && b[x][y] > 1 + b[i][j])
        {
            b[x][y] = 1 + b[i][j];
            k++;
            v[k] = { x, y };
        }
        /// est:
        x = i;
        y = j + 1;
        if (a[x][y] != '*' && b[x][y] > 1 + b[i][j])
        {
            b[x][y] = 1 + b[i][j];
            k++;
            v[k] = { x, y };
        }
        /// vest:
        x = i;
        y = j - 1;
        if (a[x][y] != '*' && b[x][y] > 1 + b[i][j])
        {
            b[x][y] = 1 + b[i][j];
            k++;
            v[k] = { x, y };
        }
    }
}

void Afisare()
{
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
            if (b[i][j] != 2000000)fout << b[i][j] << " ";
            else fout << "X ";
        fout << "\n";
    }
}
void Fill(short i, short j, int Val)
{
    if (a[i][j] != '*' && b[i][j] >= Val && c[i][j] == 0)
    {
        c[i][j] = 1;
        Fill(i - 1, j, Val);
        Fill(i + 1, j, Val);
        Fill(i, j - 1, Val);
        Fill(i, j + 1, Val);
    }
}
void CautBin()
{
    int st, dr, mij, Val;
    st = 1; dr = b[xi][yi];
    Val = -1;
    while (st <= dr)
    {
        mij = (st + dr) / 2;
        for (int i = 1; i <= n; i++)
            c[i].reset();
        Fill(xi, yi, mij);
        if (c[xo][yo] == 1)
        {
            Val = mij;
            st = mij + 1;
        }
        else dr = mij - 1;
    }
    fout << Val;
}
void Rezolva()
{
    int Val, i;
    for (Val = b[xi][yi]; Val >= 1; Val--)
    {
        for (i = 1; i <= n; i++)
            c[i].reset();
        Fill(xi, yi, Val);
        if (c[xo][yo] == 1)
        {
            fout << Val << "\n";
            fout.close();
            return;
        }
    }
    fout << "-1\n";
    fout.close();
}

int main()
{
    Citire();
    Bordare();
    Initial();
    Distante();
    CautBin();
    return 0;
}