Cod sursa(job #3306978)

Utilizator SGLDCASA SI PODUL SGLD Data 15 august 2025 20:05:17
Problema Barbar Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.94 kb
#include <fstream>
#include<queue>
using namespace std;
ifstream in("barbari.in");
ofstream out("barbari.out");
vector<pair<int,int>> dra;
vector<pair<int,int>> blocked;
int n,m,te1,te2,ie1,ie2;
bool lee1(int x,int y,int x2,int y2,bool blocke[][1001])
{
    bool viz[176][176]={0};
    int dist[176][176]={0};
    queue<pair<int,int>> q;
    q.push({x,y});
    viz[x][y]=1;
    while(!q.empty())
    {
        int x1=q.front().first;
        int y1=q.front().second;
        if(x1==x2 && y1==y2)
        {
            return true;
        }
        q.pop();
        if(!blocke[x1+1][y1] && !viz[x1+1][y1] && x1 && y1 && x1<=n && y1<=m)
        {
            if(x1)
                dist[x1+1][y1]=dist[x1][y1]+1;
            q.push({x1+1,y1});
            viz[x1+1][y1]=1;
        }
        if(!blocke[x1-1][y1] && !viz[x1-1][y1] && x1 && y1 && x1<=n && y1<=m)
        {
            dist[x1-1][y1]=dist[x1][y1]+1;
            q.push({x1-1,y1});
            viz[x1-1][y1]=1;
        }
        if(!blocke[x1][y1+1] && !viz[x1][y1+1] && x1 && y1 && x1<=n && y1<=m)
        {
            dist[x1][y1+1]=dist[x1][y1]+1;
            q.push({x1,y1+1});
            viz[x1][y1+1]=1;
        }
        if(!blocke[x1][y1-1] && !viz[x1][y1-1] && x1 && y1 && x1<=n && y1<=m)
        {
            dist[x1][y1-1]=dist[x1][y1]+1;
            q.push({x1,y1-1});
            viz[x1][y1-1]=1;
        }
    }
    return false;

}
void lee2(int x,int y,int d,bool block[][1001])
{
    bool viz[176][176]={0};
    int dist[176][176]={0};
    queue<pair<int,int>> q;
    q.push({x,y});
    viz[x][y]=1;
    if(dist[x][y]==d)
    {
        block[x][y]=true;
    }
    while(!q.empty())
    {
        int x1=q.front().first;
        int y1=q.front().second;
        q.pop();
        if(dist[x1][y1]<=d)
        {
            block[x1][y1]=true;
        }
        if(dist[x1][y1]<d)
        {
            if(!viz[x1+1][y1] && x1+1 && y1 && x1+1<=n && y1<=m)
            {
                dist[x1+1][y1]=dist[x1][y1]+1;
                q.push({x1+1,y1});
                viz[x1+1][y1]=1;
            }
            if(!viz[x1-1][y1] && x1-1 && y1 && x1-1<=n && y1<=m)
            {
                dist[x1-1][y1]=dist[x1][y1]+1;
                q.push({x1-1,y1});
                viz[x1-1][y1]=1;
            }
            if(!viz[x1][y1+1] && x1 && y1+1 && x1<=n && y1+1<=m)
            {
                dist[x1][y1+1]=dist[x1][y1]+1;
                q.push({x1,y1+1});
                viz[x1][y1+1]=1;
            }
            if(!viz[x1][y1-1] && x1 && y1-1 && x1<=n && y1-1<=m)
            {
                dist[x1][y1-1]=dist[x1][y1]+1;
                q.push({x1,y1-1});
                viz[x1][y1-1]=1;
            }
        }

    }

}
bool nr(int w)
{
    bool blocky[1001][1001]={0};
    for(int i=0; i<(int)blocked.size(); i++)
    {
        blocky[blocked[i].first][blocked[i].second]=true;
    }
    for(int i=0; i<(int)dra.size(); i++)
    {
        lee2(dra[i].first,dra[i].second,w,blocky);
    }
    if(lee1(te1,te2,ie1,ie2,blocky))
    {
        return true;
    }
    return false;

}
int main()
{
    in>>n>>m;
    char a;
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
        {
            in>>a;
            if(a=='*')
            {
                blocked.push_back({i,j});
            }
            if(a=='D')
            {
                dra.push_back({i,j});
            }
            if(a=='I')
            {
                te1=i;
                te2=j;
            }
            if(a=='O')
            {
                ie1=i;
                ie2=j;
            }

        }
    }
    int l=0,r=1000;
    int ans=0;
    while(l<=r)
    {
        int mid=(r+1+l)/2;
        if(nr(mid))
        {
            l=mid+1;
            ans=mid;
        }
        else
        {
            r=mid-1;
        }
    }
    out<<ans+1;

    return 0;
}