Cod sursa(job #2920013)

Utilizator ciocan_catalinCiocan Catalin - Iulian ciocan_catalin Data 21 august 2022 15:39:14
Problema Barbar Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.62 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];
bitset <1005> g[1005];


queue < pair < int, int > > Q;

int di[]= {0,0,1,-1};
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++)
        {
            if(a[i][j]=='I')
            {
                sti=i;
                stj=j;
            }
            if(a[i][j]=='O')
            {
                fti=i;
                ftj=j;
            }
            if(a[i][j] == 'D')
            {
                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();
    Q.push(make_pair(sti,stj));
    g[sti][stj] = true;
    while(!Q.empty())
    {
        int i = Q.front().first;
        int j = Q.front().second;
        if(i == fti && j == ftj) return true;
        Q.pop();
        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 &&  !g[inext][jnext])
            {
                g[inext][jnext] = true;
                Q.push(make_pair(inext,jnext));

            }
        }
    }
    return g[fti][ftj];
}


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]>d[i][j] || d[inext][jnext]==0))
            {
                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;
        for(int i=1; i<=r; i++)
        {
            g[i].reset();
        }
        if(Fill(mij))
        {
            st=mij+1;
            sol=mij;
        }
        else
        {
            dr=mij-1;
        }
    }
    fout<<sol<<"\n";
}


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