Cod sursa(job #2923249)

Utilizator AndiTicleaTiclea Andi AndiTiclea Data 12 septembrie 2022 12:29:21
Problema Barbar Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.56 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <cstring>
#define N 1005
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");

int n,m,i,j;
char a[N][N];
int d[N][N];
int aparitie[N][N],ok[N][N];
struct celula
{
    int x,y;
};
int cnt_dragoni;
celula dragoni[N];
celula start,iesire;
queue<celula> Q;

void bordare()
{
    for(i=0;i<=n+1;i++) aparitie[i][0]=aparitie[i][m+1]=1;
    for(j=0;j<=m+1;j++) aparitie[0][j]=aparitie[n+1][j]=1;
}

int valid(celula cell)
{
    if(aparitie[cell.x][cell.y]==0) return 1;
        else return 0;
}

void distanta()
{
    for(i=1;i<=cnt_dragoni;i++) Q.push(dragoni[i]),aparitie[dragoni[i].x][dragoni[i].y]=1;
    while(!Q.empty())
    {
        celula curent=Q.front(); Q.pop();
        for(i=0;i<4;i++)
        {
            celula vecin;
            vecin.x=curent.x + vx[i];
            vecin.y=curent.y + vy[i];
            if(valid(vecin))
            {
                aparitie[vecin.x][vecin.y]=1;
                d[vecin.x][vecin.y]=d[curent.x][curent.y]+1;
                Q.push(vecin);
            }
        }
    }

}

/*int verificare(int val)
{
    queue<celula> C; int ok[N][N]; memset(ok,0,sizeof(ok)); memset(aparitie,0,sizeof(aparitie));
    C.push(start);
    while(!Q.empty())
    {
        celula curent=Q.front(); Q.pop();
        for(i=0;i<4;i++)
        {
            celula vecin;
            vecin.x=curent.x + vx[i];
            vecin.y=curent.y + vy[i];
            if(valid(vecin))
            {
                aparitie[vecin.x][vecin.y]=1;
                d[vecin.x][vecin.y]=d[curent.x][curent.y]+1;
                Q.push(vecin);
            }
        }
    }
}*/


int main()
{
    fin>>n>>m;

    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            {
                fin>>a[i][j];
                if(a[i][j]=='*') d[i][j]=-1,aparitie[i][j]=1;
                if(a[i][j]=='D') dragoni[++cnt_dragoni]={i,j};
                if(a[i][j]=='I') start={i,j};
                if(a[i][j]=='O') iesire={i,j};
            }

    bordare();
    distanta();

    /*for(i=1;i<=n;i++,cout<<endl)
        for(j=1;j<=m;j++)
        cout<<d[i][j]<<" ";*/

    int sol=-1;
    int ls,m,ld;
    ls=1; ld=n+m;
    while(ls<=ld)
    {
            int da_nu=1;
            m=(ls+ld)/2;

            for(i=1;i<=n;i++)
                for(j=1;j<=m;j++)
                    aparitie[i][j]=ok[i][j]=0;

            if(d[start.x][start.y]>=m)
            {
                Q.push(start);
                aparitie[start.x][start.y]=1;
                ok[start.x][start.y]=1;
            }
            else da_nu=0;
            while(!Q.empty() && da_nu)
            {
                celula curent=Q.front(); Q.pop(); aparitie[curent.x][curent.y]=1;
                int vx[5]={-1,0,1,0};
                int vy[5]={0,1,0,-1};
                for(i=0;i<4;i++)
                {
                    celula vecin;
                    vecin={curent.x+vx[i],curent.y+vy[i]};
                    if(aparitie[vecin.x][vecin.y]==0)
                    {
                        aparitie[vecin.x][vecin.y]=1;
                        if(d[vecin.x][vecin.y]>=m)
                        {
                            ok[vecin.x][vecin.y]=1;
                            Q.push(vecin);
                        }
                    }

                }
            }
            celula iesire={9,4};
            if(ok[iesire.x][iesire.y]==0) ld=m-1;
            else {sol=m; ls=m+1;}
    }

    fout<<sol;


    return 0;
}