Cod sursa(job #2961666)

Utilizator PatruMihaiPatru Mihai PatruMihai Data 6 ianuarie 2023 20:34:51
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.73 kb
#include <bits/stdc++.h>

using namespace std;

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

struct pct
{
    int x, y;
}start, finish;

const int NMAX = 1007;
int n, m;
vector<vector<int>> v(NMAX, vector<int>(NMAX));
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};

bool inmat(int x, int y)
{
    return (x >= 1 && x <= n && y >= 1 && y <= m);
}

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

    queue<pct> dragon;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            char c;
            fin >> c;
            if(c == 'I')
            {
                start.x = i;
                start.y = j;
                v[i][j] = -1;
            }
            else if(c == 'O')
            {
                finish.x = i;
                finish.y = j;
                v[i][j] = -1;
            }
            else if(c == '*')
            {
                v[i][j] = -2;
            }
            else if(c == 'D')
            {
                v[i][j] = -0;
                dragon.push({i, j});
            }
            else if(c == '.')
            {
                v[i][j] = -1;
            }
        }
    }

    while(!dragon.empty())
    {
        int i = dragon.front().x;
        int j = dragon.front().y;
        dragon.pop();

        for(int d = 0; d < 4; d++)
        {
            int diri = i + dx[d];
            int dirj = j + dy[d];
            if(inmat(diri, dirj) && v[diri][dirj] == -1)
            {
                v[diri][dirj] = v[i][j] + 1;
                dragon.push({diri, dirj});
            }
        }
    }

    int left = 1;
    int right = n * m;
    int mid;
    int ans = -1;

    while(left <= right)
    {
        mid = (left + right) / 2;

        if(v[start.x][start.y] >= mid)
        {
            vector<vector<bool>> ok(NMAX, vector<bool>(NMAX, false));
            queue<pct> q;
            q.push(start);
            ok[start.x][start.y] = true;
            while(!q.empty())
            {
                int i = q.front().x;
                int j = q.front().y;
                q.pop();

                for(int d = 0; d < 4; d++)
                {
                    int diri = i + dx[d];
                    int dirj = j + dy[d];
                    if(inmat(diri, dirj) && !ok[diri][dirj] && v[diri][dirj] >= mid)
                    {
                        ok[diri][dirj] = true;
                        q.push({diri, dirj});
                    }
                }
            }

            if(ok[finish.x][finish.y])
            {
                ans = mid;
                left = mid + 1;
            }
            else
            {
                right = mid - 1;
            }
        }
        else
        {
            right = mid - 1;
        }
    }
    fout << ans;


    return 0;
}