Cod sursa(job #3212392)

Utilizator Mihai_AritonMihai Ariton Mihai_Ariton Data 11 martie 2024 18:01:35
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <bits/stdc++.h>
#pragma GCC optimize ("O3")
using namespace std;

char v[1005][1005];
int d[1005][1005], f[1005][1005];
queue<pair<int, int>>q;
int dirl[]={-1, 0, 1, 0};
int dirc[]={0, 1, 0, -1};
void dfs(int l, int c, int a)
{
    int x, y;
    f[l][c]=1;
    for(int i=0; i<=3; i++)
    {
        x=l+dirl[i];y=c+dirc[i];
        if(v[x][y]=='.' && f[x][y]==0 && d[x][y]>=a)
        dfs(x, y, a);
    }
}
int main()
{
    ifstream cin("barbar.in");
    ofstream cout("barbar.out");
    
    int n, m, l, c, l2, c2, lin, col, x, y, st, dr, ans=0, mij;
    cin>>n>>m;
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
        {
            cin>>v[i][j];
            if(v[i][j]=='I')
            {
                l=i;
                c=j;
                v[i][j]='.';
            }
            else if(v[i][j]=='O')
            {
                l2=i;
                c2=j;
                v[i][j]='.';
            }
            else if(v[i][j]=='D')
            {
                v[i][j]='.';
                q.push({i, j});
            }
        }
    }
    while(!q.empty())
    {
        pair<int, int>crn=q.front();
        lin=crn.first;col=crn.second;
        q.pop();
        for(int i=0; i<=3; i++)
        {
            x=lin+dirl[i];y=col+dirc[i];
            if(v[x][y]=='.' && d[x][y]==0)
            {
                d[x][y]=d[lin][col]+1;
                q.push({x, y});
            }
        }
    }
    st=0;dr=1e9;
    while(st<=dr)
    {
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=m; j++)
            f[i][j]=0;
        }
        mij=(st+dr)/2;
        dfs(l, c, mij);
        if(f[l2][c2]==1)
        {
            ans=mij;
            st=mij+1;
        }
        else
        dr=mij-1;
    }
    cout<<ans;
    
    return 0;
}