Cod sursa(job #3319261)

Utilizator VladStroicaStroica Vlad Cristian VladStroica Data 31 octombrie 2025 14:09:24
Problema Barbar Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
int n, m;
int sx, sy, ex, ey;
int dist[4005][4005];
bool wall[4005][4005];
vector<pair<int,int>> dragoni;
int dx[4] = {-1,1,0,0};
int dy[4] = {0,0,-1,1};

bool inside(int x,int y){ return x>=1 && x<=n && y>=1 && y<=m; }

bool can(int k) {
    vector<vector<int>> vis(n+1, vector<int>(m+1, 0));
    queue<pair<int,int>> q;
    if (dist[sx][sy] < k) return false;
    q.push({sx, sy});
    vis[sx][sy] = 1;
    while (!q.empty()) {
        auto [x,y]=q.front(); q.pop();
        if (x==ex && y==ey) return true;
        for (int d=0; d<4; d++) {
            int nx=x+dx[d], ny=y+dy[d];
            if (inside(nx,ny) && !wall[nx][ny] && !vis[nx][ny] && dist[nx][ny]>=k) {
                vis[nx][ny]=1;
                q.push({nx,ny});
            }
        }
    }
    return false;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++) {
            char c; cin>>c;
            if(c=='*') wall[i][j]=1;
            else if(c=='D') dragoni.push_back({i,j});
            else if(c=='I') sx=i,sy=j;
            else if(c=='O') ex=i,ey=j;
            dist[i][j]=INF;
        }

    // BFS de la dragoni
    queue<pair<int,int>> q;
    for(auto [x,y]:dragoni){ dist[x][y]=0; q.push({x,y}); }
    while(!q.empty()){
        auto [x,y]=q.front(); q.pop();
        for(int d=0;d<4;d++){
            int nx=x+dx[d], ny=y+dy[d];
            if(inside(nx,ny) && !wall[nx][ny] && dist[nx][ny]==INF){
                dist[nx][ny]=dist[x][y]+1;
                q.push({nx,ny});
            }
        }
    }

    int st=0, dr=n+m, ans=-1;
    while(st<=dr){
        int mid=(st+dr)/2;
        if(can(mid)){ ans=mid; st=mid+1; }
        else dr=mid-1;
    }
    cout<<ans;
}