Cod sursa(job #3366003)

Utilizator flipiiiTatucu Filip flipiii Data 28 septembrie 2026 12:55:20
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.93 kb
#include <bits/stdc++.h>
using namespace std;
int dist[1001][1001], distd[1001][1001], n, m;
char mat[1001][1001];
int a1, a2, b1, b2;
vector<pair<int, int>> muie;
int di[]={-1, 0, 1, 0}, dj[]={0, -1, 0, 1};
bool check(int x, int y) {
    if (x>0 && x<=n && y>0 && y<=m && mat[x][y]!='*') return true;
    return false;
}
/*void lee(int a1, int a2) {
    queue<pair<int, int>> q;
    q.push({a1, a2});
    dist[a1][a2] = 1;
    while(!q.empty()) {
        int i = q.front().first, j = q.front().second;
        q.pop();
        for(int k = 0; k < 4; k++) {
            int x = i + di[k], y = j + dj[k];
            if (check(x, y) && dist[x][y] > dist[i][j] + 1) {
                dist[x][y] = dist[i][j]+1;
                q.push({x, y});
            }
        }
    }
}*/
void lee2() {
    queue<pair<int, int>> q;
    for (int i=0; i<muie.size(); i++) {
        q.push({muie[i].first, muie[i].second});
        distd[muie[i].first][muie[i].second] = 0;
    }
    while(!q.empty()) {
        int i = q.front().first, j = q.front().second;
        q.pop();
        for(int k = 0; k < 4; k++) {
            int x = i + di[k], y = j + dj[k];
            if (check(x, y) && distd[x][y] > distd[i][j] + 1 ) {
                distd[x][y] = distd[i][j]+1;
                q.push({x, y});
            }
        }
    }
}
bool verif(int d) {
    for (int i=1; i<=n; i++)
        for (int j=1; j<=m; j++)
            dist[i][j]=-1;
    if (distd[a1][a2]<d)
        return false;
    queue<pair<int, int>> q;
    q.push({a1, a2});
    dist[a1][a2] = 0;
    while (!q.empty()) {
        int i=q.front().first, j = q.front().second;
        q.pop();
        if (i==b1 && j==b2) {
            return true;
        }
        for(int k = 0; k < 4; k++) {
            int x=i+di[k], y=j+dj[k];
            if (!check(x,y))
                continue;
            if (dist[x][y]!=-1)
                continue;
            if (distd[x][y] < d)
                continue;
            dist[x][y] = dist[i][j] + 1;
            q.push({x, y});
        }
        }
    return false;
    }
int main() {
    ifstream cin("barbar.in");
    ofstream cout("barbar.out");
    cin >> n >> m;
    for (int i = 1; i<=n; i++) {
        for (int j=1; j<=m; j++) {
            cin >> mat[i][j];
            if (mat[i][j]=='I') {
                a1 = i; a2 = j;
            }
            else if (mat[i][j]=='D') {
                muie.push_back({i, j});
            }
            else if (mat[i][j]=='O') {
                b1=i; b2=j;
            }
        }
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            dist[i][j] = 2e9;
            distd[i][j] = 2e9;
            if (mat[i][j]=='*')
                dist[i][j]=-1;
        }
    }
    lee2();
    // lee(a1, a2);
    int st=0, dr=n*m, mij, poz=-1;
    while (st<=dr) {
        mij=(st+dr)/2;
        if (verif(mij)) {
            st=mij+1;
            poz=mij;
        }
        else
            dr=mij-1;
    }
    cout << poz;
    return 0;
}