Cod sursa(job #3327697)

Utilizator LucaMirsolea14Luca Mirsolea LucaMirsolea14 Data 4 decembrie 2025 19:48:46
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.8 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");

struct AA{
    int l,c;
};

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

int n, m, d[1002][1002], ls, cs, lf, cf;
bool fr[1002][1002], obstacle[1002][1002];
queue<AA> coada;

bool interior(int l,int c){
    return l>0&&c>0&&l<=n&&c<=m;
}

void Constr_dist(){
    AA varf;
    int k, l ,c;

    while(!coada.empty()){
        varf = coada.front();
        coada.pop();
        for(k=0;k<4;k++){
            l = varf.l + di[k];
            c = varf.c + dj[k];
            if(interior(l,c) && d[l][c] > d[varf.l][varf.c] + 1){
                d[l][c] = d[varf.l][varf.c] + 1;
                coada.push({l,c});
            }
        }
    }
}

bool Posibil(int p){
    if(d[ls][cs] < p) 
        return false;
    
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            fr[i][j] = false;
    
    while(!coada.empty())
        coada.pop();
    
    fr[ls][cs] = true;
    coada.push({ls,cs});

    AA varf;
    int k, l ,c;

    while(!coada.empty()){
        varf = coada.front();
        coada.pop();

        if(varf.l == lf && varf.c == cf)
            return true;

        for(k=0;k<4;k++){
            l = varf.l + di[k];
            c = varf.c + dj[k];
            if(interior(l,c) && !fr[l][c] && !obstacle[l][c] && d[l][c] >= p){
                fr[l][c] = true;
                coada.push({l,c});
            }
        }
    }
    return false;
}

int main(){
    int i, j;
    char c;
    fin >> n >> m;

    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            d[i][j] = 1e9;
    
    for(i=1;i<=n;i++){
        for(j=1;j<=m;j++){
            fin >> c;
            
            if(c == 'D'){
                coada.push({i,j});
                d[i][j] = 1; 
                obstacle[i][j] = false;  
            }
            else if(c == 'I'){
                ls = i;
                cs = j;
                obstacle[i][j] = false;
            }
            else if(c == 'O'){
                lf = i;
                cf = j;
                obstacle[i][j] = false;
            }
            else if(c == '*'){
                obstacle[i][j] = true;
            }
            else if(c == '.'){
                obstacle[i][j] = false;
            }
        }
    }

    Constr_dist();

    if(obstacle[ls][cs] || obstacle[lf][cf]){
        fout << -1;
        return 0;
    }

    int st=1, dr=n*m, mij, ans=-1;

    while(st<=dr){
        mij = (st+dr)/2;
        
        if(Posibil(mij)){
            ans = mij;
            st = mij+1;
        }
        else{
            dr = mij-1;
        }
    }
    
    if(ans == -1)
        fout << -1;
    else
        fout << ans-1;  
    
    return 0;
}