Cod sursa(job #3260580)

Utilizator PetruApostolApostol Mihnea Petru PetruApostol Data 2 decembrie 2024 19:52:43
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <fstream>
#include <deque>
using namespace std;

ifstream cin("barbar.in");
ofstream cout("barbar.out");

deque<pair<int,int>> q;
deque<int> q1;
int n,m,startl,startc,sfarsitl,sfarsitc;
int dist[1001][1001];
int viz[1001][1001];

int ml[]={1,0,-1,0};
int mc[]={0,1,0,-1};

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

void curat(){
    int i,j;
    for(i=1;i<=n;i++){
        for(j=1;j<=m;j++){
            viz[i][j]=0;
        }
    }
}

bool vf(int a){
    curat();
    int l,c,l1,c1,i;
    q.push_back({startl,startc});
    viz[startl][startc]=1;
    while(!q.empty()){
        l=q.front().first;
        c=q.front().second;
        q.pop_front();
        for(i=0;i<4;i++){
            l1=l+ml[i];
            c1=c+mc[i];
            if(in(l1,c1) && !viz[l1][c1] && dist[l1][c1]!=-1 && dist[l1][c1]-1>=a){
                viz[l1][c1]=1;
                q.push_back({l1,c1});
            }
        }
    }
    return (viz[sfarsitl][sfarsitc]==1);
}

int main()
{
    int i,j,l,c,l1,c1,st,dr,rasp,mij;
    char ch;
    cin>>n>>m;
    for(i=1;i<=n;i++){
        for(j=1;j<=m;j++){
            cin>>ch;
            if(ch=='I'){
                startl=i;startc=j;
            }else if(ch=='*'){
                dist[i][j]=-1;
            }else if(ch=='D'){
                q.push_back({i,j});dist[i][j]=1;
            }else if(ch=='O'){
                sfarsitl=i;sfarsitc=j;
            }
        }
    }
    while(!q.empty()){
        l=q.front().first;
        c=q.front().second;
        q.pop_front();
        for(i=0;i<4;i++){
            l1=l+ml[i];
            c1=c+mc[i];
            if(in(l1,c1) && dist[l1][c1]==0){
                dist[l1][c1]=dist[l][c]+1;
                q.push_back({l1,c1});
            }
        }
    }
    st=0;dr=1e6;rasp=-1;
    while(st<=dr){
        mij=(st+dr)/2;
        if(dist[startl][startc]-1>=mij && vf(mij)){
            rasp=mij;st=mij+1;
        }else{
            dr=mij-1;
        }
    }
    cout<<rasp;
    return 0;
}