Cod sursa(job #2922398)

Utilizator Vladgiuscavladgiusca Vladgiusca Data 8 septembrie 2022 10:24:25
Problema Barbar Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.14 kb
#include <fstream>
#include <queue>
using namespace std;

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

int r,c,ii,ij,fi,fj;
queue<pair<int,int> >q;
int di[]={-1,0,1,0};
int dj[]={0,1,0,-1};
const int NMAX=1001;
int D[NMAX][NMAX];
int R[NMAX][NMAX]={0};

void LEE(){
    int k,ni,nj,i,j;
    while(q.size()>0)
    {
        i=q.front().first;
        j=q.front().second;
        q.pop();
        for(k=0; k<4; k++){
            ni=i+di[k];
            nj=j+dj[k];
            if(ni>0 && ni<=r && nj>0 && nj<=c && D[ni][nj]==0){
                D[ni][nj]=D[i][j]+1;
                q.push(make_pair(ni,nj));
            }
        }
    }
}

bool LEEcb(int val){

    int i,j,k,ni,nj;
    for(i=1; i<=r; i++){
        for(j=1; j<=c; j++)
            R[i][j]=0;
    }

    queue<pair<int,int> >qq;
    qq.push(make_pair(ii,ij));
    R[ii][ij]=1;
    while(qq.size()>0){
        i=qq.front().first;
        j=qq.front().second;
        qq.pop();
        for(k=0; k<4; k++){
            ni=i+di[k];
            nj=j+dj[k];
            if(ni>0 && ni<=r && nj>0 && nj<=c && D[ni][nj]>val && R[ni][nj]==0){
                R[ni][nj]=R[i][j]+1;
                qq.push(make_pair(ni,nj));
            }
        }
    }
    if(R[fi][fj])
        return 1;
    return 0;
}

int cb(){
    bool ex;
    int mid,minim=r*c;
    int le=1,ri=r*c;
    while(le<=ri){
        mid=(le+ri)/2;
        ex=LEEcb(mid);
        if(ex){
            minim=mid;
            le=mid+1;
        }
        else
            ri=mid-1;
    }
    return minim;
}
int main()
{
    char ch;
    int i,j;
    cin>>r>>c;
    for(i=1; i<=r; i++){
        for(j=1; j<=c; j++){
            cin>>ch;
            if(ch=='*')
                D[i][j]=-1;
            else if(ch=='D'){
                q.push(make_pair(i,j));
                D[i][j]=1;
            }
            else if(ch=='I'){
                ii=i;
                ij=j;
            }
            else if(ch=='O'){
                fi=i;
                fj=j;
            }
        }
    }
    LEE();
    int rez=cb();
    cout<<rez;
    return 0;
}