Cod sursa(job #3326348)

Utilizator LucaMirsolea14Luca Mirsolea LucaMirsolea14 Data 28 noiembrie 2025 12:15:08
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.45 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");

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

struct AA{

    int l,c,pasi;

};

int mat[1002][1002], n , m, fr[1001][1002], lfinal,cfinal,lstart,cstart,dist[1002][1002];
int sp[1002][1002];
vector<AA> vd;
queue<AA> coada;

void Completeaza(){

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

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

        for(k=0;k<4;k++){
            l = varf.l + di[k];
            c = varf.c + dj[k];
            pasi = varf.pasi + 1;
            if(!fr[l][c] && mat[l][c]!=-1){
                dist[l][c] = pasi;
                fr[l][c]=1;
                coada.push({l,c,pasi});
            }
        }
    }

}

bool Posibil(int l,int c, int lg){

    int ll,cc;

    fr[l][c] = 1;
    if(l == lfinal && c == cfinal)
        return true;

    int h=0;

    for(int k=0;k<4;k++){
        ll = l+di[k];
        cc = c+dj[k];
        if(mat[ll][cc]!=-1 && !fr[ll][cc] && dist[ll][cc] >= lg)
            h += Posibil(ll,cc,lg);
    }

    return h;

}

int main(){

    char c;
    int i,j;

    fin >> n >> m;

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

    for(i=1;i<=n;i++){
        for(j=1;j<=m;j++){
            fin >> c;
            if(c=='I'){
                lstart = i;
                cstart = j;
                continue;
            }
            if(c=='*'){
                mat[i][j] = -1;
                fr[i][j]=1;
                continue;
            }
            if(c=='D'){
                mat[i][j] = -1;
                fr[i][j]=1;
                coada.push({i,j,0});
                continue;
            }
            if(c=='O'){
                lfinal = i;
                cfinal = j;
                continue;
            }
        }
    }

    Completeaza();

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

    int st, dr, mij, ans=-1;

    st=1;
    dr=10000;

    while(st <= dr){
            for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
            fr[i][j]=0;
        mij = (st+dr)/2;
        if(Posibil(lstart,cstart,mij)){
            ans = mij;
            st=mij+1;
        }
        else
            dr = mij-1;
    }
    fout << ans;

}