Cod sursa(job #3302586)

Utilizator Mihai_OctMihai Octavian Mihai_Oct Data 9 iulie 2025 11:45:22
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.67 kb
#include <bits/stdc++.h>

using namespace std;

#define ST_DIO 0
#if ST_DIO
    #define fin cin
    #define fout cout
#else
    ifstream fin("barbar.in");
    ofstream fout("barbar.out");
#endif  // ST_DIO

const int di[] = {1, 0, -1, 0};
const int dj[] = {0, 1, 0, -1};
const int INF = 1e9 + 7;
char a[1002][1002];
int dist[1002][1002];
queue<pair<int, int>> q;
bool fr[1002][1002];
int n, m, i, j;

int exitI, exitJ;
int startI, startJ;

static inline bool InMat(int i, int j) {
    return (1 <= i && i <= n && 1 <= j && j <= m);
}

static inline bool Verif(int d = 1) {
    memset(fr, false, sizeof(fr));
    fr[startI][startJ] = true;

    q.push({startI, startJ});

    while(!q.empty()) {
        int i = q.front().first;
        int j = q.front().second;
        q.pop();

        for(int dir = 0; dir < 4; dir++) {
            int in = i + di[dir];
            int jn = j + dj[dir];

            if(!InMat(in, jn)) continue;
            if(a[in][jn] != '.') continue;
            if(fr[in][jn]) continue;

            if(dist[in][jn] >= d) {
                fr[in][jn] = true;
                q.push({in, jn});
            }
        }
    }
    return fr[exitI][exitJ];
}

int main() {
    fin >> n >> m;
    for(i = 1; i <= n; i++) {
        for(j = 1; j <= m; j++) {
            fin >> a[i][j];
            if(a[i][j] == 'D') {
                q.push({i, j});
                dist[i][j] = 1;
            }
            else if(a[i][j] == 'I') {
                startI = i;
                startJ = j;
                a[i][j] = '.';
            }
            else if(a[i][j] == 'O') {
                exitI = i;
                exitJ = j;
                a[i][j] = '.';
            }
        }
    }

    while(!q.empty()) {
        int i = q.front().first;
        int j = q.front().second;
        q.pop();

        for(int dir = 0; dir < 4; dir++) {
            int in = i + di[dir];
            int jn = j + dj[dir];

            if(!InMat(in, jn)) continue;
            if(dist[in][jn] != 0) continue;
            if(a[in][jn] == '.' || a[in][jn] == 'D') {
                dist[in][jn] = 1 + dist[i][j];
                q.push({in, jn});
            }
        }
    }

    for(i = 1; i <= n; i++) {
        for(j = 1; j <= m; j++) dist[i][j]--;
    }

    if(!Verif(1)) fout << "-1";
    else {
        int st = 1, dr = n * m;
        int rasp = -1;

        while(st <= dr) {
            int mij = st + (dr - st) / 2;
            if(Verif(mij)){
                rasp = mij;
                st = mij + 1;
            }
            else dr = mij - 1;
        }
        fout << rasp;
    }

    return 0;
}