Cod sursa(job #2929139)

Utilizator Alex_DiaconuDiaconu Alexandru Alex_Diaconu Data 24 octombrie 2022 21:07:27
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.69 kb
#include <fstream>
#include <queue>
using namespace std;

ifstream cin ("barbar.in");
ofstream cout ("barbar.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 N=1001;
int D[N][N];
int R[N][N]={0};

void LEE()
{
    int i, j;
    while(q.size()>0)
    {
        i=q.front().first;
        j=q.front().second;
        q.pop();
        for(int k=0; k<4; k++)
        {
            int 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)
{

    for(int i=1; i<=r; i++)
    {
        for(int j=1; j<=c; j++)
            R[i][j]=0;
    }
    queue <pair <int,int> >qq;
    if(D[ii][ij]>val)
    {
        qq.push(make_pair(ii,ij));
        R[ii][ij]=1;
    }
    while(qq.size()>0)
    {
        int i=qq.front().first, j=qq.front().second;
        qq.pop();
        for(int k=0; k<4; k++)
        {
            int 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=0,ri=r*c;
    while(le<=ri)
    {
        mid=(le+ri)/2;
        ex=LEEcb(mid);
        if(ex)
        {
            minim=mid;
            le=mid+1;
        }
        else
        {
            ri=mid-1;
        }
    }
    if(minim<r*c)
    {
        return minim;
    }
    return -1;
}

int main()
{
    char ch;
    cin >> r >> c;
    for(int i=1; i<=r; i++)
    {
        for(int 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;
}

/*bool ex;
    int mid,minim=r*c;
    int le=0,ri=r*c;
    while(le<=ri){
        mid=(le+ri)/2;
        ex=LEEcb(mid);
        if(ex){
            minim=mid;
            le=mid+1;
        }
        else
            ri=mid-1;
    }
    if(minim<r*c)
        return minim;
    return -1;*/