Cod sursa(job #3269454)

Utilizator vladm98Munteanu Vlad vladm98 Data 19 ianuarie 2025 12:23:11
Problema Barbar Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.11 kb
#include <bits/stdc++.h>

using namespace std;

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

int a[1002][1002];
int vizitare[1002][1002];
int n, m;
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
const int INF = 1e9;

void Lee_dragoni(vector<pair<int, int>>dragoni, int n, int m)
{
    queue <pair <int, int>> coada;

    for(int i=1; i<=n; ++i)
        for(int j=1; j<=m; ++j)
            vizitare[i][j] = INF;

    for(auto in: dragoni)
    {
        coada.push(in);
        vizitare[in.first][in.second] = 0;
    }

    while(!coada.empty())
    {
        pair<int, int> curenta = coada.front();
        coada.pop();

        for(int i=0; i<4; ++i)
        {
             int x = curenta.first + dx[i];
             int y = curenta.second + dy[i];

             if(x > n || x <= 0 || y > n || y <= 0 || a[x][y] == 1) continue;
             if(vizitare[x][y] <= vizitare[curenta.first][curenta.second] + 1) continue;

             vizitare[x][y] = vizitare[curenta.first][curenta.second] + 1;
             coada.push({x, y});
        }
    }
}

int vizi[1002][1002];
void Lee(pair<int, int > in, pair<int, int> out, int n, int m)
{
    queue <pair <int, int>> coada;

    int st = 0, dr = 1000000, mini = -1;
    while(st <= dr)
    {
        int mij = (st+dr)/2;
        for(int i=1; i<=n; ++i)
            for(int j=1; j<=m; ++j)
                vizi[i][j] = false;

        coada.push(in);
        vizi[in.first][in.second] = 1;

        while(!coada.empty())
        {
            pair<int, int> curenta = coada.front();
            coada.pop();

            for(int i=0; i<4; ++i)
            {
                 int x = curenta.first + dx[i];
                 int y = curenta.second + dy[i];

                 if(x > n || x <= 0 || y > n || y <= 0 || a[x][y] == 1) continue;
                 if(vizi[x][y]) continue;
                 if(vizitare[x][y] < mij) continue;

                 vizi[x][y] = true;
                 coada.push({x, y});
            }
        }
        if(!vizi[out.first][out.second] or vizitare[in.first][in.second] < mij)
            dr = mij-1;
        else{
                st = mij + 1;
                mini = mij;
        }
    }
    fout << -1;
}

int main()
{
    int n, m;
    vector<pair<int, int>> dragoni;
    pair<int, int> intrare, iesire;
    char s[1002];
    fin >> n >> m;
    for(int i=1; i<=n;++i)
    {
        fin >> s;
        for(int j=1; j<=m; ++j)
        {
            if(s[j - 1] == '*')
                a[i][j] = 1;
            else if(s[j - 1] == 'I')
                    {
                        intrare.first = i;
                        intrare.second = j;
                    }else if(s[j - 1] == 'O')
                                {
                                    iesire.first = i;
                                    iesire.second = j;
                                }else if(s[j - 1] == 'D')
                                            {
                                                dragoni.push_back({i, j});
                                            }
        }
    }

    Lee_dragoni(dragoni, n, m);
    Lee(intrare, iesire, n, m);

    fin.close();
    fout.close();
    return 0;
}