Cod sursa(job #2775216)

Utilizator CelestinNegraru Celestin Celestin Data 14 septembrie 2021 22:05:43
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.85 kb
#include <iostream>
#include <fstream>
#include <queue>
#define nmax 1005
using namespace std;
struct coord{
    int lin;
    int col;
};
const int dx[]={0,0,-1,1},dy[]={-1,1,0,0};
ifstream f;
ofstream g;
queue<coord> coada;
char A[nmax][nmax];
int D[nmax][nmax],n,m,i1,j1,i2,j2,sol;
void READ()
{
    f.open("barbar.in",ios::in);
    f>>n>>m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            f>>A[i][j];
            switch(A[i][j]){
              case 'I':{
                i1=i;
                j1=j;
              }break;
              case 'O':{
                 i2=i;
                 j2=j;
              }break;
            }
        }
    }
    f.close();
    return;
}
inline bool INMAT(int x,int y)
{
    return(x>=1&&x<=n&&y>=1&&y<=m);
}
bool BFS(int range)
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            switch(A[i][j]){
              case '*':{
                 D[i][j]=-1;
              }break;
              case 'D':{
                 D[i][j]=1;
                 coada.push({i,j});
              }break;
              case 'I':{
                 D[i][j]=1;
              }break;
              case 'O':{
                 D[i][j]=0;
              }break;
              case '.':{
                 D[i][j]=0;
              }break;

            }
        }
    }
    while(!coada.empty())
    {
        int is=coada.front().lin;
        int js=coada.front().col;
        coada.pop();
        if(D[is][js]<range)
        {for(int i=0;i<=3;i++)
        {
            int inou=is+dx[i];
            int jnou=js+dy[i];
            if(INMAT(inou,jnou)&&D[inou][jnou]==0)
            {
                D[inou][jnou]=D[is][js]+1;
                coada.push({inou,jnou});
            }
        }
        }
    }
    if(D[i2][j2])
        return false;
    else{

        coada.push({i1,j1});
        while(!coada.empty())
        {
            int is=coada.front().lin;
            int js=coada.front().col;
            coada.pop();
            for(int i=0;i<=3;i++)
            {
                int inou=is+dx[i];
                int jnou=js+dy[i];
                if(INMAT(inou,jnou)&&D[inou][jnou]==0)
                {
                    D[inou][jnou]=D[is][js]+1;
                    coada.push({inou,jnou});
                }
            }
        }
        return(D[i2][j2]);
    }
}
void BINARY()
{
    g.open("barbar.out",ios::out);
    int st=1;
    int dr=n*n;
    while(st<=dr)
    {
        int mid=(st+dr)>>1;
        if(BFS(mid))
            st=mid+1,sol=mid;
        else dr=mid-1;
    }
    if(sol)
    g<<sol;
    else g<<-1;
    g.close();
    return;
}
int main()
{
    std :: ios_base :: sync_with_stdio(false);
    std :: cin.tie(0);
    READ();
    BINARY();
    return 0;
}