Cod sursa(job #3348377)

Utilizator TeodorVTeodorV TeodorV Data 21 martie 2026 10:13:31
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.57 kb
#include <bits/stdc++.h>

using namespace std;

const string NUMEFISIER="barbar";
ifstream fin(NUMEFISIER+".in");
ofstream fout(NUMEFISIER+".out");

const int Nmax=1001;
int n,m;
bool visited[Nmax][Nmax];
int distDragon[Nmax][Nmax];
pair<int, int> startPoint,endPoint;

const int dl[]={-1,0,1,0};
const int dc[]={0,1,0,-1};

void parcurgere(pair<int, int> point, int dist)
{
    visited[point.first][point.second]=1;

    for(int i=0; i<4; i++)
    {
        pair<int, int> newPoint=make_pair(point.first+dl[i],point.second+dc[i]);
        if(1<=newPoint.first && newPoint.first<=n && 1<=newPoint.second && newPoint.second<=m)
        {
            if(!visited[newPoint.first][newPoint.second] && distDragon[newPoint.first][newPoint.second]!=-2 && distDragon[newPoint.first][newPoint.second]>=dist)
                parcurgere(newPoint, dist);
        }
    }
}

bool existaDrum(int dist)
{
    for(int i=1; i<=n; i++)
    for(int j=1; j<=m; j++)
        visited[i][j]=0;
    parcurgere(startPoint, dist);
    return visited[endPoint.first][endPoint.second];
}

int main()
{
    fin>>n>>m;
    char c;
    queue<pair<int, int>> qDragoni;
    for(int i=1; i<=n; i++)
    for(int j=1; j<=m; j++)
    {
        fin>>c;
        distDragon[i][j]=-1;
        switch(c)
        {
        case '.':
            break;
        case 'D':
            distDragon[i][j]=0;
            qDragoni.push(make_pair(i, j));
            break;
        case '*':
            distDragon[i][j]=-2;
            break;
        case 'I':
            startPoint=make_pair(i, j);
            break;
        case 'O':
            endPoint=make_pair(i, j);
            break;
        }
    }

    while(!qDragoni.empty())
    {
        pair<int, int> point=qDragoni.front();
        qDragoni.pop();

        for(int i=0; i<4; i++)
        {
            pair<int, int> newPoint=make_pair(point.first+dl[i], point.second+dc[i]);
            if(1<=newPoint.first && newPoint.first<=n && 1<=newPoint.second && newPoint.second<=m)
            {
                if(distDragon[newPoint.first][newPoint.second]==-1)
                {
                    distDragon[newPoint.first][newPoint.second]=1+distDragon[point.first][point.second];
                    qDragoni.push(newPoint);
                }
            }
        }
    }


    int st=0,dr=n+m,mij,rez=0;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(existaDrum(mij))
        {
            rez=mij;
            st=mij+1;
        }
        else dr=mij-1;
    }
    fout<<rez;
    return 0;
}