Cod sursa(job #3365793)

Utilizator AlistarMateiAlistar Matei AlistarMatei Data 24 septembrie 2026 17:13:39
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.34 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int r, c;
char a[1005][1005];
int dd[1005][1005];
bool v[1005][1005];
int X, Y, eX, eY;
int di[]={-1, 0, 1, 0};
int dj[]={0, 1, 0, -1};
bool vf(int k)
{
    if(dd[X][Y]<k || dd[eX][eY]<k)
        return 0;
    for(int i=1; i<=r; i++)
        for(int j=1; j<=c; j++)
            v[i][j]=0;
    queue<pair<int, int>>q;
    q.push({X, Y});
    v[X][Y]=1;
    while(!q.empty())
    {
        int x=q.front().first;
        int y=q.front().second;
        q.pop();
        if(x==eX && y==eY)
            return 1;
        for(int p=0; p<4; p++)
        {
            int vx=x+di[p];
            int vy=y+dj[p];
            if (vx>=1 && vx<=r && vy>=1 && vy<=c)
            {
                if (!v[vx][vy] && a[vx][vy]!='*' && dd[vx][vy]>=k)
                {
                    v[vx][vy]=1;
                    q.push({vx, vy});
                }
            }
        }
    }
    return 0;
}

int main()
{
    fin>>r>>c;
    queue<pair<int, int>>qq;
    for (int i=1; i<=r; i++)
    {
        string l;
        fin>>l;
        for(int j=1; j<=c; j++)
        {
            a[i][j]=l[j-1];
            dd[i][j]=-1;
            if(a[i][j]=='D')
            {
                dd[i][j]=0;
                qq.push({i, j});
            }
            else if(a[i][j]=='I')
            {
                X=i;
                Y=j;
            }
            else if(a[i][j]=='O')
            {
                eX=i;
                eY=j;
            }
        }
    }
    while(!qq.empty())
    {
        int x=qq.front().first;
        int y=qq.front().second;
        qq.pop();
        for(int p=0; p<4; p++)
        {
            int vx=x+di[p];
            int vy=y+dj[p];
            if (vx>=1 && vx<=r && vy>=1 && vy<=c)
            {
                if (a[vx][vy]!='*' && dd[vx][vy]==-1)
                {
                    dd[vx][vy]=dd[x][y]+1;
                    qq.push({vx, vy});
                }
            }
        }
    }
    int st=0, dr=r+c, d=-1;
    while (st<=dr)
    {
        int mij=(st+dr)/2;
        if (vf(mij))
        {
            d=mij;
            st=mij+1;
        }
        else
        {
            dr=mij-1;
        }
    }
    fout<<d;
    return 0;
}