Cod sursa(job #3122175)

Utilizator Traian_7109Traian Mihai Danciu Traian_7109 Data 17 aprilie 2023 18:41:45
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <iostream>
#include <fstream>
#include <queue>

using namespace std;

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

const short NMAX = 1000;
bool vis[NMAX+5][NMAX+5];
char a[NMAX+5][NMAX+5];
short d[NMAX+5][NMAX+5];
const short d1[] = {-1, 0, 1, 0};
const short d2[] = {0, 1, 0, -1};
queue<pair<short, short>> q;
pair<short, short> in, out;
short n, m;

bool valid(pair<short, short> x)
{
    return x.first >= 1 && x.first <= n && x.second >= 1 && x.second <= m;
}

void intialize()
{
    for (short i = 1; i <= n; i++)
        for (short j = 1; j <= m; j++) vis[i][j] = false;
}

void clear()
{
    while (!q.empty()) q.pop();
}

bool solution(short dist)
{
    intialize();
    q.push(in);
    vis[in.first][in.second] = true;

    if (d[in.first][in.second] < dist) return false;

    while (!q.empty()) {
        pair<short, short> x = q.front();
        q.pop();

        if (x.first == out.first && x.second == out.second) {
            clear();
            return true;
        }

        for (short dir = 0; dir < 4; dir++) {
            pair<short, short> y = make_pair(x.first+d1[dir], x.second+d2[dir]);

            if (valid(y) && d[y.first][y.second] >= dist && !vis[y.first][y.second])
                q.push(y), vis[y.first][y.second] = true;
        }
    }

    return false;
}

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

    for (short i = 1; i <= n; i++)
        for (short j = 1; j <= m; j++) {
            fin>>a[i][j], d[i][j] = -1;

            if (a[i][j] == 'D') d[i][j] = 0, q.push(make_pair(i, j));
            if (a[i][j] == 'I') in = make_pair(i, j);
            if (a[i][j] == 'O') out = make_pair(i, j);
        }

    while (!q.empty()) {
        pair<short, short> x = q.front();
        q.pop();

        for (short dir = 0; dir < 4; dir++) {
            pair<short, short> y = make_pair(x.first+d1[dir], x.second+d2[dir]);

            if (valid(y) && a[y.first][y.second] != '*' && d[y.first][y.second] == -1)
                q.push(y), d[y.first][y.second] = d[x.first][x.second]+1;
        }
    }

    short left = 0, right = n+m, sol = -1;

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

        if (solution(middle)) sol = middle, left = middle+1;
        else right = middle-1;
    }

    fout<<sol;
    return 0;
}