Cod sursa(job #3338104)

Utilizator bogdan124Visan Bogdan bogdan124 Data 31 ianuarie 2026 14:10:34
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.35 kb
#include <fstream>
#include <queue>
#include <cstring>

using namespace std;
const int NMAX=1000;

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

queue<pair<int,int>>q;
char p[NMAX+2][NMAX+2];
int dist[NMAX+2][NMAX+2];
pair<int,int>aux,nou;
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
bool viz[NMAX+2][NMAX+2];
int xs,ys,xd,yd;

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

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

    q.push({xs,ys});
    viz[xs][ys]=1;
    while(!q.empty()&&!found)
    {
        aux=q.front();
        for(dir=0;dir<4;dir++)
        {
            nou.first=aux.first+dx[dir];
            nou.second=aux.second+dy[dir];
            if(dist[nou.first][nou.second]>=dist_min && !viz[nou.first][nou.second])
            {
                viz[nou.first][nou.second]=1;
                q.push(nou);
                if(nou.first==xd&&nou.second==yd)
                    found=1;
            }
        }
        q.pop();
    }

    return found;
}
int main()
{
    int i,j,r,c;
    fin>>r>>c;
    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')
            {
                q.push({i,j});
                viz[i][j]=1;
            }
        }
    while(!q.empty())
    {
        aux=q.front();
        for(int dir=0;dir<4;dir++)
        {
            nou.first=aux.first+dx[dir];
            nou.second=aux.second+dy[dir];
            if((p[nou.first][nou.second]=='.'||p[nou.first][nou.second]=='I'||p[nou.first][nou.second]=='O')&&!viz[nou.first][nou.second])
            {
                dist[nou.first][nou.second]=dist[aux.first][aux.second]+1;
                viz[nou.first][nou.second]=1;
                q.push(nou);
            }
        }
        q.pop();
    }
    int last=0;
    int st=1;
    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;
}