Cod sursa(job #3327504)

Utilizator LucaMirsolea14Luca Mirsolea LucaMirsolea14 Data 4 decembrie 2025 11:11:39
Problema Barbar Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.41 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, int l,int c){

    //fout << l << " " << c << '\n';

    if(d[l][c] < p)
        return false;

    fr[l][c] = 1;

    if(l == lf && c == cf)
        return true;
    int h = 0;

    for(int k=0;k<4;k++){
        if(fr[l+di[k]][c+dj[k]]==0 && mat[l+di[k]][c+dj[k]] == 0 && d[l+di[k]][c+dj[k]] >= p)
            h += Posibil(p,l+di[k],c+dj[k]);
    }
    return h;
}

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, 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, ls, cs)){
            ans = mij;
            st=mij+1;
        }
        else
            dr=mij-1;
    }
    if(ans == -1)
        fout << -1;
    else
        fout << ans-1;

}