Cod sursa(job #3317275)

Utilizator vicctorVictor Popa vicctor Data 22 octombrie 2025 23:59:35
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.48 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");

const int di[] = {0, 0, 1, -1}; //constantele pentru
const int dj[] = {1, -1, 0, 0}; //navigarea celulelor

int n, m;
int wall[1005][1005], distdragon[1005][1005], visited[1005][1005];
int starti, startj, exiti, exitj;
queue<pair<int,int>> q;


int main()
{
    fin>>n>>m;
    char cel;

    for(int i=1; i<=n; i++) for (int j=1; j<=m; j++){ //interpretarea celulelor
        fin>>cel;
        if(cel=='*'){
            wall[i][j]=1;
            distdragon[i][j]=-2;
        }
        else if(cel=='D'){
            q.push({i, j});
            distdragon[i][j]=0;
        }
        else if(cel=='I'){
            starti=i; startj=j;
            distdragon[i][j]=-1;
        }
        else if(cel=='O'){
            exiti=i; exitj=j;
            distdragon[i][j]=-1;
        }
        else distdragon[i][j]=-1;
    }


    while(!q.empty()){                                //bfs de la dragoni
        int x=q.front().first, y=q.front().second;
        q.pop();

        for(int k=0; k<4; k++){
            int nx = x+di[k];
            int ny = y+dj[k];
            if(nx>=1&&nx<=n &&ny>=1&&ny<=m && wall[nx][ny]==0 ){
                if(distdragon[nx][ny]==-1){
                    distdragon[nx][ny]=distdragon[x][y]+1;
                    q.push(make_pair(nx, ny));
                }
            }
        }
    }


    //cautare binara pentru distanta maxima de la drum la dragon
    int low=0, high=n+m, best=-1, mid;
    while(low<=high){
        mid=(low+high)/2;
        for(int i=1; i<=n; i++)
            for(int j=1; j<=m; j++)
            visited[i][j]=0;
        while(!q.empty()) q.pop(); //clear queue

    if(distdragon[starti][startj]>=mid){
        q.push(make_pair(starti, startj)); //incepem bfs ul de la start daca e <= mid
        visited[starti][startj]=1;
    }
    while(!q.empty()) {
        int x=q.front().first, y=q.front().second;  //bfs
        q.pop();
        for(int k=0; k<4; k++){
            int nx = x+di[k];
            int ny = y+dj[k];

        if(nx<1 || nx>n || ny<1 || ny>m) continue;
        if(wall[nx][ny]==1 || visited[nx][ny]==1 || distdragon[nx][ny]<mid) continue;

        visited[nx][ny]=1;
        q.push(make_pair(nx, ny));
        }
    }
    if(visited[exiti][exitj]==1){
        best=mid;
        low=mid+1;
    } else {
        high=mid-1;
    }
    }
    fout<<best;
    return 0;
}