Cod sursa(job #2966849)

Utilizator LucaMuresanMuresan Luca Valentin LucaMuresan Data 18 ianuarie 2023 16:27:47
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.29 kb
#include <bits/stdc++.h>

using namespace std;

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

int c[1005][1005];
int d[1005][1005];
bitset<1005>perete[1005];

int n, m;
// dc nu merge "y1"?
int x1, yy1, x2, y2;

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

bool check (int val)
{
    if (c[x1][yy1] - 1 < val)
        return false;

    for (int i=1; i<=n; i++)
    {
        for (int j=1; j<=m; j++)
            d[i][j] = 0;
    }

    d[x1][yy1] = 1;

    queue<pair<int, int>>q;

    q.push({x1, yy1});

    while (!q.empty())
    {
        int xx = q.front().first, yy = q.front().second;
        if (xx == x2 && yy == y2)
            return true;

        for (int k=0; k<4; k++)
        {
            int i = xx + dx[k], j = yy + dy[k];
            if (i > 0 && j > 0 && i <= n && j <= m && !perete[i][j] && !d[i][j] && c[i][j] - 1 >= val)
            {
                q.push({i, j});
                d[i][j] = d[xx][yy] + 1;
            }
        }

        q.pop();

    }

    return false;
}

int main()
{
    in >> n >> m;

    for (int i=1; i<=n; i++)
    {
        for (int j=1; j<=m; j++)
            c[i][j] = 2e9;
    }

    queue<pair<int, int>>q;

    for (int i=1; i<=n; i++)
    {
        for (int j=1; j<=m; j++)
        {
            char ch;
            in >> ch;

            if (ch == 'I')
                x1 = i, yy1 = j;
            else if (ch == 'O')
                x2 = i, y2 = j;
            else if (ch == 'D')
                c[i][j] = 1, q.push({i, j});
            else if (ch == '*')
                perete[i][j] = true;
        }
    }

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

        for (int k=0; k<4; k++)
        {
            int i = xx + dx[k], j = yy + dy[k];
            if (i > 0 && j > 0 && i <= n && j <= m && c[i][j] == 2e9)
            {
                c[i][j] = c[xx][yy] + 1;
                q.push({i, j});
            }
        }
    }

    int l=0, r=1e9;
    int sol = -1;

    while (l <= r)
    {
        int mid = (l + r) / 2;
        if (check(mid))
            l = mid + 1, sol = mid;
        else
            r = mid - 1;
    }

    out << sol;

    return 0;
}