Cod sursa(job #3327698)

Utilizator LucaMirsolea14Luca Mirsolea LucaMirsolea14 Data 4 decembrie 2025 19:50:11
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.96 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], fr[1002][1002], ls, cs, lf, cf;
int mat[1002][1002];
AA coada[1000005];
int p, u;

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

bool Posibil(int dst){
    memset(fr, 0, sizeof(fr));
    p = 1; u = 0;
    
    if(d[ls][cs] < dst)
        return false;
    
    coada[++u] = {ls, cs};
    fr[ls][cs] = 1;
    
    while(p <= u){
        int l = coada[p].l;
        int c = coada[p].c;
        
        if(l == lf && c == cf)
            return true;
            
        for(int k=0; k<4; k++){
            int ln = l + di[k];
            int cn = c + dj[k];
            
            if(interior(ln, cn) && mat[ln][cn] == 0 && fr[ln][cn] == 0){
                if(d[ln][cn] >= dst){
                    fr[ln][cn] = 1;
                    coada[++u] = {ln, cn};
                }
            }
        }
        p++;
    }
    return false;
}

int main(){
    int i, j;
    char c;
    fin >> n >> m;
    
    p = 1; u = 0;
    
    for(i=1; i<=n; i++){
        for(j=1; j<=m; j++){
            fin >> c;
            d[i][j] = 0;
            
            if(c == '.'){
                mat[i][j] = 0;
            }
            else if(c == '*'){
                mat[i][j] = -1; 
            }
            else if(c == 'I'){
                mat[i][j] = 0;
                ls = i;
                cs = j;
            }
            else if(c == 'O'){
                mat[i][j] = 0;
                lf = i;
                cf = j;
            }
            else if(c == 'D'){
                mat[i][j] = 0;
                coada[++u] = {i, j};
                d[i][j] = 1;
            }
        }
    }
    
    while(p <= u){
        int l = coada[p].l;
        int c = coada[p].c;
        
        for(int dir=0; dir<4; dir++){
            int ln = l + di[dir];
            int cn = c + dj[dir];
            
            if(interior(ln, cn)){
                if(d[ln][cn] == 0 && mat[ln][cn] == 0){
                    coada[++u] = {ln, cn};
                    d[ln][cn] = d[l][c] + 1;
                }
            }
        }
        p++;
    }
    
    for(i=1; i<=n; i++){
        for(j=1; j<=m; j++){
            if(d[i][j] == 0 && !(i==ls&&j==cs) && !(i==lf&&j==cf)){
                d[i][j] = 1000000000; 
            }
            if(mat[i][j] == -1){
                d[i][j] = 0;  
            }
        }
    }
    
    int st = 0, 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;
}