Cod sursa(job #3316477)

Utilizator TeodoRazvanStancu Teodor-Razvan TeodoRazvan Data 18 octombrie 2025 21:41:59
Problema Barbar Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.2 kb
#include <bits/stdc++.h>
#include <fstream>

using namespace std;

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

const int di[]={0,0,-1,1},dj[]={-1,1,0,0};

int n,m,a[1005][1005],h[1005][1005],si,sj,fi,fj,att;
bool gasit=false;
queue<pair<int,int>>q,q2;

bool ok(int i,int j){
    if(i<1||j<1||i>n||j>m) return false;
    return true;
}

void lee(int att,int mij){
    q2.push({si,sj});
    int i,j,ni,nj;
    h[si][sj]=att;
    if(a[si][sj]<mij) return;
    while(!q2.empty()){
        i=q2.front().first;
        j=q2.front().second;
        h[i][j]=att;
        q2.pop();
        for(int k=0;k<4;k++){
            ni=i+di[k];
            nj=j+dj[k];
            if(ok(ni,nj)){
                if(a[ni][nj]!=-1&&a[ni][nj]>=mij&&h[ni][nj]!=att){
                    q2.push({ni,nj});
                }
            }
        }
    }
    if(h[fi][fj]==att) gasit=true;
}

int main(){
    fin>>n>>m;
    char c;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            fin>>c;
            if(c=='*'){
                a[i][j]=-1;
            }else if(c=='I'){
                si=i;
                sj=j;
            }else if(c=='O'){
                fi=i;
                fj=j;
            }else if(c=='D'){
                q.push({i,j});
                a[i][j]=-1;
            }
        }
    }
    int st=1,dr=-1,rez=-1;
    while(!q.empty()){
        int i,j,val,ni,nj;
        i=q.front().first;
        j=q.front().second;
        q.pop();
        val=a[i][j];
        for(int k=0;k<4;k++){
            ni=i+di[k];
            nj=j+dj[k];
            if(ok(ni,nj)){
                if(a[ni][nj]==0){
                    if(val==-1) a[ni][nj]=val+2;
                    else a[ni][nj]=val+1;
                    dr=max(dr,a[ni][nj]);
                    q.push({ni,nj});
                }
            }
        }
    }
    att=1;
    while(st<=dr){
        int mij=(st+dr)/2;
        gasit=false;
        lee(att,mij);
        att++;
        if(gasit){
            st=mij+1;
            if(rez==-1) rez=mij;
            else rez=max(rez,mij);
        }else{
            dr=mij-1;
        }
    }
    fout<<rez;
    return 0;
}