Cod sursa(job #3300442)

Utilizator sebibosssebi ioan sebiboss Data 15 iunie 2025 20:50:29
Problema Barbar Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.56 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
char matrix[1050][1050];
int distante[1050][1050];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int R,C;
pair<int,int> start,sf;
queue<pair<int,int>> Q;
void bordare(int n,int m)
{
    for(int i=0;i<=n+1;i++)
        matrix[i][0]=matrix[i][m+1]='/';
    for(int i=0;i<=m+1;i++)
    matrix[0][i]=matrix[n+1][i]='/';
}
int valid(int mind)
{
    bool visited[1300][1300]={false};
    if(distante[start.first][start.second]<mind)
        return false;
    Q.push({start.first,start.second});
    visited[start.first][start.second]=true;
    while(!Q.empty())
    {
        pair<int,int> curr = Q.front();
        Q.pop();
        if(curr.first==sf.first && curr.second==sf.second)
            return true;
        for(int i=0;i<4;i++)
        {
            int vx=curr.first+dx[i];
            int vy=curr.second+dy[i];
            if(matrix[vx][vy]!='/' && matrix[vx][vy]!='*' && distante[vx][vy]>=mind
                && visited[vx][vy]==false)
            {
                Q.push({vx,vy});
                visited[vx][vy]=true;
            }
        }
    }
    return false;
}
void runlee()
{
    for(int i=1;i<=R;i++)
        for(int j=1;j<=C;j++)
        distante[i][j]=1e9;
    while(!Q.empty())
    {
        pair<int,int> curr = Q.front();
        Q.pop();
        if(matrix[curr.first][curr.second]=='D')
            distante[curr.first][curr.second]=0;

        for(int i=0;i<4;i++)
        {
            int vx=curr.first+dx[i];
            int vy=curr.second+dy[i];
            if(matrix[vx][vy]!='/' && matrix[vx][vy]!='*' &&
               distante[vx][vy]>distante[curr.first][curr.second]+1)
            {
                distante[vx][vy]=distante[curr.first][curr.second]+1;
                Q.push({vx,vy});
            }
        }
    }
}
int main()
{

    f>>R>>C;
    int st=1,dr=R*C,result=-1;
    for(int i=1;i<=R;i++)
    {
        string s;
        f>>s;
        for(int j=1;j<=C;j++)
        {
            matrix[i][j]=s[j-1];
            if(matrix[i][j]=='I')
                start.first=i,start.second=j;
            if(matrix[i][j]=='O')
                sf.first=i,sf.second=j;
            if(matrix[i][j]=='D')
            Q.push({i,j});
        }
    }
    bordare(R,C);
    runlee();
    while(st<=dr)
    {
        int m=(st+dr)/2;
        if(valid(m))
        {
            result = m;
            st=m+1;
        }
        else
            dr=m-1;
    }
    g<<result;
    return 0;
}