Cod sursa(job #2920020)

Utilizator ciocan_catalinCiocan Catalin - Iulian ciocan_catalin Data 21 august 2022 15:49:51
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.7 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <bitset>
using namespace std;


ifstream fin("barbar.in");
ofstream fout("barbar.out");


int r,c,maxim,sti,stj,fti,ftj,sol;


char a[1005][1005];
int d[1005][1005];
bool viz[1005][1005];


queue < pair < int, int > > Q;

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


inline void read()
{
    fin>>r>>c;
    for(int i=1; i<=r; i++)
    {
        fin>>(a[i]+1);
        for(int j=1; j<=c; j++)
        {
            d[i][j] = -1;
            if(a[i][j]=='I')
            {
                sti=i;
                stj=j;
            }
            else if(a[i][j]=='O')
            {
                fti=i;
                ftj=j;
            }
            else if(a[i][j] == 'D')
            {
                d[i][j] = 0;
                Q.push(make_pair(i,j));
            }
        }
    }
}


inline bool check(int i,int j)
{
    return(i>=1 && i<=r && j>=1 && j<=c && a[i][j]!='*' && a[i][j]!='D');
}




inline bool Fill(int mij)
{
    if(d[sti][stj] < mij) return false;

    while(!Q.empty()) Q.pop();

    for(int i=1; i<=r; i++)
    {
        for(int j = 1; j <= c; j++)
            viz[i][j] = false;
    }
    viz[sti][stj] = true;

    Q.push(make_pair(sti,stj));

    while(!Q.empty())
    {
        int i = Q.front().first;
        int j = Q.front().second;
        Q.pop();
        if(i == fti && j == ftj) return true;
        for(int dir = 0; dir < 4; dir++)
        {
            int inext = i + di[dir];
            int jnext = j + dj[dir];
            if(check(inext,jnext) && d[inext][jnext] >= mij &&  !viz[inext][jnext])
            {
                viz[inext][jnext] = true;
                Q.push(make_pair(inext,jnext));

            }
        }
    }
    return false;
}


inline void lee()
{
    int i,j,inext,jnext;
    while(!Q.empty())
    {
        i=Q.front().first;
        j=Q.front().second;
        Q.pop();
        for(int dir=0; dir<4; dir++)
        {
            inext=i+di[dir];
            jnext=j+dj[dir];
            if(check(inext,jnext) && d[inext][jnext]==-1)
            {
                d[inext][jnext]=d[i][j]+1;
                maxim=max(maxim,d[inext][jnext]);
                Q.push(make_pair(inext,jnext));
            }
        }
    }

}


void solve()
{
    sol=-1;
    int st=1;
    int dr=r;
    while(st<=dr)
    {
        int mij=(st+dr)/2;
        if(Fill(mij))
        {
            st=mij+1;
            sol=mij;
        }
        else
        {
            dr=mij-1;
        }
    }
    fout<<sol<<"\n";
}


int main()
{
    read();
    lee();
    solve();
    return 0;
}