Cod sursa(job #2920444)

Utilizator IvanAndreiIvan Andrei IvanAndrei Data 24 august 2022 12:47:14
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.9 kb
#include <fstream>
#include <queue>
#include <climits>

#include <climits>
#pragma GCC optimize("O1")
#pragma GCC optimize("O2")
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")

using namespace std;

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

const int max_size = 1e3 + 1, max_dir = 4;

int a[max_size][max_size], d[max_size][max_size], p[max_size][max_size], n, m, xs, ys, xj, yj, max1,
di[] = {-1, 0, 1, 0},
dj[] = {0, 1, 0, -1};
queue <pair <int, int>> coada;

void prec_d()
{
    while (!coada.empty())
    {
        int i = coada.front().first, j = coada.front().second;
        max1 = max(d[i][j], max1);
        coada.pop();
        for (int k = 0; k < max_dir; k++)
        {
            int iv = i + di[k], jv = j + dj[k];
            if (iv > 0 && jv > 0 && iv <= n && jv <= m && a[iv][jv] == 0)
            {
                a[iv][jv] = 1;
                d[iv][jv] = d[i][j] + 1;
                coada.push({iv, jv});
            }
        }
    }
}

bool probabfs (int x)
{
    if (d[xs][ys] < x || d[xj][yj] < x)
    {
        return false;
    }
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            if (a[i][j] == -1)
            {
                p[i][j] = -1;
            }
            else
            {
                p[i][j] = 0;
            }
        }
    }
    coada.push({xs, ys});
    while (!coada.empty())
    {
        int i = coada.front().first, j = coada.front().second;
        coada.pop();
        for (int k = 0; k < max_dir; k++)
        {
            int iv = i + di[k], jv = j + dj[k];
            if (iv > 0 && iv <= n && jv > 0 && jv <= m && p[iv][jv] == 0 && d[iv][jv] >= x)
            {
                p[iv][jv] = 1;
                coada.push({iv, jv});
            }
        }
    }
    if (p[xj][yj] == 1)
    {
        return true;
    }
    return false;
}

int main ()
{
    in >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            char ch;
            in >> ch;
            if (ch == 'D')
            {
                a[i][j] = -1;
                coada.push({i, j});
            }
            if (ch == 'I')
            {
                xs = i;
                ys = j;
            }
            if (ch == '*')
            {
                a[i][j] = -1;
                d[i][j] = -1;
            }
            if (ch == 'O')
            {
                xj = i;
                yj = j;
            }
        }
    }
    prec_d();
    int dr = n, e = 1, ans = -1;
    while (e <= dr)
    {
        e *= 2;
    }
    for (int st = 0; e > 0; e >>= 1)
    {
        if (probabfs(st + e))
        {
            ans = st + e;
            st += e;
        }
    }
    out << ans;
    in.close();
    out.close();
    return 0;
}