Cod sursa(job #3148845)

Utilizator AlexPlesescuAlexPlesescu AlexPlesescu Data 4 septembrie 2023 17:09:19
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.53 kb
#include <bits/stdc++.h>

#define cin fin
#define cout fout
using namespace std;
ifstream cin("barbar.in");
ofstream cout("barbar.out");
const int nmax = 1005;
int n, m, st, dr, mij, mat[nmax][nmax], istart, jstart, ifinal, jfinal, dist[nmax][nmax], ans;
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
queue<pair<int, int>> dragoni;
bitset<nmax> viz[nmax];

inline bool inmat(int i, int j) {
    return i >= 1 and i <= n and j >= 1 and j <= m;
}

inline bool verif(int mid) {
    queue<pair<int, int>> Q;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            viz[i][j] = 0;
        }
    }
    Q.push({istart, jstart});
    viz[istart][jstart] = 1;
    while (!Q.empty()) {
        int i = Q.front().first;
        int j = Q.front().second;
        Q.pop();
        for (int k = 0; k < 4; k++) {
            int ii = i + dx[k];
            int jj = j + dy[k];
            if (inmat(ii, jj) && dist[ii][jj] != INT_MIN && dist[ii][jj] >= mid && !mat[ii][jj] && !viz[ii][jj]) {
                viz[ii][jj] = 1;
                Q.push({ii, jj});
            }
        }
    }
    if (viz[ifinal][jfinal])
        return true;
    return false;
}

int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            dist[i][j] = INT_MIN;
        }
    }
    cin.get();
    for (int i = 1; i <= n; i++) {
        string s;
        cin >> s;
        for (int j = 0; j < (int) s.size(); j++) {
            if (s[j] == 'D') {
                dragoni.push({i, j + 1});
                mat[i][j + 1] = 1;
                dist[i][j + 1] = 0;
            } else if (s[j] == '*') {
                mat[i][j + 1] = 1;
            } else if (s[j] == 'I') {
                istart = i;
                jstart = j + 1;
            } else if (s[j] == 'O') {
                ifinal = i;
                jfinal = j + 1;
            }
        }
    }
    while (!dragoni.empty()) {
        int i = dragoni.front().first;
        int j = dragoni.front().second;
        dragoni.pop();
        for (int k = 0; k < 4; k++) {
            int ii = i + dx[k];
            int jj = j + dy[k];
            if (inmat(ii, jj) && !mat[ii][jj] && dist[ii][jj] == INT_MIN) {
                dist[ii][jj] = dist[i][j] + 1;
                dragoni.push({ii, jj});
            }
        }
    }
    st = 0;
    dr = n * m;
    while (st <= dr) {
        mij = st + (dr - st) / 2;
        if (verif(mij)) {
            ans = mij;
            st = mij + 1;
        } else
            dr = mij - 1;
    }
    cout << ans;
    return 0;
}