Cod sursa(job #3327513)

Utilizator LucaMirsolea14Luca Mirsolea LucaMirsolea14 Data 4 decembrie 2025 11:24:50
Problema Barbar Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.71 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], mat[1002][1002], ls, cs, lf, cf, fr[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, aux;
    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){

    while(!coada.empty())
        coada.pop();
    if(d[ls][cs] >= p)
        coada.push({ls,cs});
    fr[ls][cs]=1;

    AA varf, aux;
    int k, l ,c;

    while(!coada.empty()){

        varf = coada.front();
        coada.pop();

       // if(p == 6)
       // fout << "   " << varf.l << " " << varf.c << '\n';

        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) && d[l][c] >= p && !fr[l][c]){
                fr[l][c] = 1;
                coada.push({l,c});
            }
        }
    }

    return false;

}

int main(){

    int i, j;

    char c;

    fin >> n >> m;

    for(i=0;i<=n;i++)
        mat[i][0] = mat[i][m+1] = 1;
    for(i=1;i<=m;i++)
        mat[0][i] = mat[n+1][i] = 1;

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

    Constr_dist();

//    for(i=1;i<=n;i++,fout<<endl)
//        for(j=1;j<=m;j++)
//            fout << d[i][j] << " ";

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

    while(st<=dr){

        for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
                fr[i][j] = 0;

        mij = (st+dr)/2;

        //fout << mij << endl;

        if(Posibil(mij)){
            ans = mij;
           st=mij+1; /// asa ramane
        }
        else
            dr=mij-1;
    }
    if(ans == -1)
        fout << -1;
    else
        fout << ans-1;

}