Cod sursa(job #2784313)

Utilizator mihaistamatescuMihai Stamatescu mihaistamatescu Data 16 octombrie 2021 12:00:12
Problema Barbar Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.49 kb
#include <fstream>
#include <cstring>
#include <deque>
#include <bitset>

#define DIM 510
using namespace std;
int C, n, m, k, ist, jst, ifin, jfin;
int a[DIM][DIM], v[DIM][DIM];
char ch;
bitset<DIM> viz[DIM];
bool ok;
deque<pair<int, int> > c;
int di[] = {0, 0, 1, -1};
int dj[] = {1, -1, 0, 0};

bool intra(int i, int j) {
    return i >= 1 && i <= n && j >= 1 && j <= m;
}

int main() {
    ifstream fin("barbar.in");
    ofstream fout("barbar.out");
    fin >> n >> m;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            fin >> ch;
            if (ch == 'I') {
                ist = i;
                jst = j;
                a[i][j] = 0;
            }
            if (ch == '*') {
                a[i][j] = 1;
            }
            if (ch == 'O') {
                a[i][j] = 0;
                ifin = i;
                jfin = j;
            }
            if (ch == 'D') {
                a[i][j] = 1;
                v[i][j] = 0;
                c.emplace_back(i, j);
            }
        }
    }
    while (!c.empty()) {
        int ic = c.begin()->first;
        int jc = c.begin()->second;
        for (int d = 0; d < 4; d++) {
            int iv = ic + di[d];
            int jv = jc + dj[d];
            if (intra(iv, jv) && a[iv][jv] == 0 && v[iv][jv] == 0) {
                v[iv][jv] = v[ic][jc] + 1;
                c.emplace_back(iv, jv);
            }
        }
        c.pop_front();
    }
    int st = 1;
    int dr = n * m;
    while (st <= dr) {
        int mid = (st + dr) / 2;
        ok = false;
        if (v[ist][jst] >= mid) {
            c.emplace_front(ist, jst);
        }
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                viz[i][j] = false;
            }
        }
        while (!c.empty()) {
            int ic = c.begin()->first;
            int jc = c.begin()->second;
            for (int d = 0; d < 4; d++) {
                int iv = ic + di[d];
                int jv = jc + dj[d];
                if (intra(iv, jv) && !a[iv][jv] && v[iv][jv] >= mid && !viz[iv][jv]) {
                    viz[iv][jv] = true;
                    c.emplace_back(iv, jv);
                    if (iv == ifin && jv == jfin) {
                        ok = true;
                    }
                }
            }
            c.pop_front();
        }
        if (ok) {
            st = mid + 1;
        } else {
            dr = mid - 1;
        }
    }
    if (ok) {
        fout << dr;
    } else {
        fout << -1;
    }
    return 0;
}