Cod sursa(job #3297710)

Utilizator eric.mesterEric Mestereaga eric.mester Data 23 mai 2025 15:56:49
Problema Barbar Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <bits/stdc++.h>
#define NMAX 1002

using namespace std;

ifstream fin("barbar.in");
ofstream fout("barbar.out");

struct pos{
    int y,x,d;
};

bool operator<(const pos &p1, const pos&p2)
{
    return p1.d < p2.d;
}

int N,M;
int stx,sty,fix,fiy;
char a[NMAX][NMAX];
queue <pos> q;
int dist[NMAX][NMAX];
int vizitat[NMAX][NMAX];

bool isin(int y,int x)
{
    return y>=1 && x>=1 && y<=N && x<=M;
}

bool sol(int d)
{
    queue <pos> q;
    q.push({sty,stx,-1});
    while(!q.empty()){
        int y=q.front().y;
        int x=q.front().x;
        q.pop();
        if(isin(y,x) && a[y][x]=='.' && vizitat[y][x]!=d && dist[y][x]>d){
            vizitat[y][x]=d;
            q.push({y-1,x,-1});
            q.push({y+1,x,-1});
            q.push({y,x-1,-1});
            q.push({y,x+1,-1});
        }
    }
    return (vizitat[fiy][fix]!=d);
}

int find_sol(int lwr,int upr)
{
    int ret=0;
    while(lwr<upr){
        int mid=(lwr+upr)/2;
        if(sol(mid)){
            ret=mid;
            upr=mid-1;
        }else{
            lwr=mid+1;
        }
    }
    return ret-1;
}

int main()
{
    fin >> N >> M;
    for(int i=1;i<=N;i++){
        for(int j=1;j<=M;j++){
            fin >> a[i][j];
            if(a[i][j]=='D'){
                q.push({i,j,1});
                a[i][j]='.';
            }else if(a[i][j]=='I'){
                stx=j;
                sty=i;
                a[i][j]='.';
            }else if(a[i][j]=='O'){
                fix=j;
                fiy=i;
                a[i][j]='.';
            }
        }
    }
    ///gasim dist pana la dragoni
    while(!q.empty()){
        int y=q.front().y;
        int x=q.front().x;
        int d=q.front().d;
        q.pop();
        if(isin(y,x) && a[y][x]=='.' && dist[y][x]==0){
            dist[y][x]=d;
            d++;
            q.push({y+1,x,d});
            q.push({y-1,x,d});
            q.push({y,x+1,d});
            q.push({y,x-1,d});
        }
    }
    fout << find_sol(1,1000000);
}