Cod sursa(job #3341513)

Utilizator skeptekal2mateio skeptekal2 Data 19 februarie 2026 19:32:35
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.75 kb
#include <fstream>
#include <queue>
#include <cstring>

using namespace std;
const int NMAX=1000;

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

queue<int>qx,qy;
char p[NMAX+2][NMAX+2];
int dist[NMAX+2][NMAX+2];
int auxx,auxy,noux,nouy;
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
bool viz[NMAX+2][NMAX+2];
int xs,ys,xd,yd;
int r,c;

bool valid(int dist_min)
{
    int dir,found=0;

    memset(viz,0,sizeof(viz));
    while(!qx.empty())
        qx.pop();
    while(!qy.empty())
        qy.pop();

    if(dist[xs][ys]<dist_min)
        return 0;

    qx.push(xs);
    qy.push(ys);
    viz[xs][ys]=1;

    while(!qx.empty()&&!found)
    {
        auxx=qx.front();
        auxy=qy.front();
        qx.pop();
        qy.pop();

        for(dir=0;dir<4;dir++)
        {
            noux=auxx+dx[dir];
            nouy=auxy+dy[dir];

            if(noux>=1&&noux<=r&&nouy>=1&&nouy<=c)
                if(p[noux][nouy]!='#')
                    if(dist[noux][nouy]>=dist_min&&!viz[noux][nouy])
                    {
                        viz[noux][nouy]=1;
                        qx.push(noux);
                        qy.push(nouy);
                        if(noux==xd&&nouy==yd)
                            found=1;
                    }
        }
    }

    return found;
}

int main()
{
    int i,j,dir;
    fin>>r>>c;

    memset(viz,0,sizeof(viz));

    for(i=1;i<=r;i++)
        for(j=1;j<=c;j++)
        {
            fin>>p[i][j];
            if(p[i][j]=='I')
            {
                xs=i;
                ys=j;
            }
            else if(p[i][j]=='O')
            {
                xd=i;
                yd=j;
            }
            else if(p[i][j]=='D')
            {
                qx.push(i);
                qy.push(j);
                viz[i][j]=1;
            }
        }

    while(!qx.empty())
    {
        auxx=qx.front();
        auxy=qy.front();
        qx.pop();
        qy.pop();

        for(dir=0;dir<4;dir++)
        {
            noux=auxx+dx[dir];
            nouy=auxy+dy[dir];

            if(noux>=1&&noux<=r&&nouy>=1&&nouy<=c)
                if((p[noux][nouy]=='.'||p[noux][nouy]=='I'||p[noux][nouy]=='O')&&!viz[noux][nouy])
                {
                    dist[noux][nouy]=dist[auxx][auxy]+1;
                    viz[noux][nouy]=1;
                    qx.push(noux);
                    qy.push(nouy);
                }
        }
    }

    int last=-1;
    int st=0;
    int dr=dist[xs][ys];
    int mij;

    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(valid(mij))
        {
            last=mij;
            st=mij+1;
        }
        else
            dr=mij-1;
    }

    fout<<last;
    return 0;
}