Cod sursa(job #2672145)

Utilizator Alex_tz307Lorintz Alexandru Alex_tz307 Data 13 noiembrie 2020 10:51:16
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.57 kb
#include <bits/stdc++.h>

using namespace std;

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

int N, M;
queue < pair < int , int > > Q;
const int di[] = {-1, 0, 1, 0},
          dj[] = {0, 1, 0, -1};

inline bool inside(int lin, int col) {
    return lin > 0 && lin <= N  && col > 0 && col <= M;
}

void Lee(vector < vector < int > >& a) {
    while(!Q.empty()) {
        int i = Q.front().first,
            j = Q.front().second;
        Q.pop();
        for(int k = 0; k < 4; ++k) {
            int iv = i + di[k],
                jv = j + dj[k];
            if(inside(iv, jv) && a[iv][jv] == 0) {
                a[iv][jv] = a[i][j] + 1;
                Q.emplace(iv, jv);
            }
        }
    }
    for(int i = 1; i <= N; ++i)
        for(int j = 1; j <= M; ++j)
            --a[i][j];
}

int main() {
    fin >> N >> M;
    vector < string > grid(N + 1);
    vector < vector < int > > d_min(N + 1, vector < int >(M + 1)), a(N + 1, vector < int >(M + 1));
    int istart = -1, jstart = -1, istop = -1, jstop = -1;
    for(int i = 1; i <= N; ++i) {
        fin >> grid[i];
        grid[i] = '0' + grid[i];
        for(int j = 1; j <= M; ++j) {
            if(grid[i][j] == 'D') {
                Q.emplace(i, j);
                d_min[i][j] = 1;
            }
            if(grid[i][j] == '*' || grid[i][j] == 'D')
                a[i][j] = -1;
            if(grid[i][j] == 'I') {
                istart = i;
                jstart = j;
            }
            if(grid[i][j] == 'O') {
                istop = i;
                jstop = j;
            }
        }
    }
    Lee(d_min);
    int st = 1, dr = N * M, ans = -1;
    while(st <= dr) {
        int mid = (st + dr) >> 1;
        if(d_min[istart][jstart] >= mid)
            Q.emplace(istart, jstart);
        a[istart][jstart] = 1;
        while(!Q.empty()) {
            int i = Q.front().first,
                j = Q.front().second;
            Q.pop();
            for(int k = 0; k < 4; ++k) {
                int iv = i + di[k],
                    jv = j + dj[k];
                if(inside(iv, jv) && a[iv][jv] == 0 && d_min[iv][jv] >= mid) {
                    Q.emplace(iv, jv);
                    a[iv][jv] = 1;
                }
            }
        }
        if(a[istop][jstop] > 0) {
            ans = mid;
            st = mid + 1;
        }
        else
            dr = mid - 1;
        for(int i = 1; i <= N; ++i)
            for(int j = 1; j <= M; ++j)
                if(a[i][j] > 0)
                    a[i][j] = 0;
    }
    fout << ans;
}