Cod sursa(job #2703584)

Utilizator gasparrobert95Gaspar Robert Andrei gasparrobert95 Data 8 februarie 2021 19:42:57
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.25 kb
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n, m, startx, starty, sfx, sfy, mt[1005][1005], mt2[1005][1005], dist[1005][1005];
int ox[] = {-1, 0, 1, 0}, oy[] = {0, 1, 0, -1};
bool block[1005][1005];
queue < pair <int, int> > q;

void readInput() {
    fin >> n >> m;
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= m; ++j) {
            char el;
            fin >> el;
            if (el == 'D') {
                block[i][j] = true;
                q.push({i, j});
            }
            if (el == '*')
                mt2[i][j] = -1;
            if (el == 'I')
                startx = i, starty = j;
            if (el == 'O')
                sfx = i, sfy = j;
        }
    return;
}

void leeDragoni() {
    while (!q.empty()) {
        int x = q.front().first, y = q.front().second;
        q.pop();
        for (int i = 0; i < 4; ++i) {
            int a = x + ox[i], b = y + oy[i];
            if (!block[a][b] && mt[a][b] == 0 && a >= 1 && a <= n && b <= m && b >= 1 && dist[a][b] == 0) {
                dist[a][b] = dist[x][y] + 1;
                q.push({a, b});
            }
        }
    }
    return;
}

void lee(int minDist) {
    while (!q.empty())
        q.pop();
    q.push({startx, starty});
    mt[startx][starty] = dist[startx][starty];
    if (mt[startx][starty] < minDist)
        return;
    while (!q.empty()) {
        int x = q.front().first, y = q.front().second;
        q.pop();
        for (int i = 0; i < 4; ++i) {
            int a = x + ox[i], b = y + oy[i];
            if (mt[a][b] == 0 && min(mt[x][y], dist[a][b]) >= minDist) {
                mt[a][b] = min(mt[x][y], dist[a][b]);
                q.push({a, b});
            }
        }
    }
    return;
}

int main() {
    readInput();
    leeDragoni();
    int st = 1, dr = 10000, rez = -1;
    while (st <= dr) {
        for (int i = 1; i <= n; ++i)
            for (int j = 1; j <= m; ++j)
                mt[i][j] = mt2[i][j];
        int mij = (st + dr) / 2;
        lee(mij);
        if (mt[sfx][sfy] != 0)
            rez = mij, st = mij + 1;
        else
            dr = mij - 1;
    }
    fout << rez;
    return 0;
}