Cod sursa(job #3255485)

Utilizator tonealexandruTone Alexandru tonealexandru Data 10 noiembrie 2024 18:36:20
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.75 kb
#include <bits/stdc++.h>
#define int long long

using namespace std;
char mat[1015][1015];

int flacari[1015][1015];
queue<pair<int, int>> q;

int dirx[] = {0, 0, -1, 1};
int diry[] = {1, -1, 0, 0};

int s1, s2, f1, f2;
int n, m;

int pericol[1015][1015];

void dfs(int i, int j, int nivel)
{
    //cout<<"  "<<i<<" "<<j<<" "<<nivel<<'\n';
    pericol[i][j] = -1;
    for(int kk=0; kk<4; kk++)
    {
        int nx = i + dirx[kk], ny = j + diry[kk];
        if( pericol[nx][ny] >= nivel && mat[nx][ny] != '*')
            dfs(nx, ny, nivel);
    }
}

bool check(int nivel)
{
    //cout<<flacari[s1][s2]<<" "<<nivel<<'\n';
    if(flacari[s1][s2] < nivel)
        return false;

    for(int i=0; i<=n+1; i++)
        for(int j=0; j<=m+1; j++)
            pericol[i][j] = flacari[i][j];

    /// verificam daca pericol[i][j] >= nivel && mat[i][j] != '*'

    dfs(s1, s2, nivel);

    /*for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
            cout<<pericol[i][j]<<" ";
        cout<<'\n';
    }
    cout<<'\n';*/

    if(pericol[f1][f2] == -1)
        return true;
    return false;
}

int32_t main()
{
    ifstream cin("barbar.in");
    ofstream cout("barbar.out");
    cin>>n>>m;

    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
            flacari[i][j] = 21e8;

    for(int i=0; i<=n+1; i++)
        flacari[i][0] = -1, flacari[i][m+1] = -1;

    for(int j=0; j<=m+1; j++)
        flacari[0][j] = -1, flacari[n+1][j] = -1;

    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
        {
            cin>>mat[i][j];
            if(mat[i][j] == 'D')
                q.push({i, j}), flacari[i][j] = 0;
            else if(mat[i][j] == 'I')
                s1 = i, s2 = j;
            else if(mat[i][j] == 'O')
                f1 = i, f2 = j;
        }

    while(q.empty() == false)
    {
        int i = q.front().first, j = q.front().second;
        q.pop();

        for(int kk=0; kk<4; kk++)
            if( flacari[ i+dirx[kk] ][ j+diry[kk] ] > flacari[i][j] + 1 )
                q.push({i+dirx[kk], j+diry[kk]}), flacari[ i+dirx[kk] ][ j+diry[kk] ] = flacari[i][j] + 1;
    }


    int maxx = 0;
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
        {
            //cout<<flacari[i][j]<<" ";
            maxx = max(maxx, flacari[i][j]);
        }
        //cout<<'\n';
    }
    //cout<<'\n';


    int st = 1, dr = maxx;
    while(st <= dr)
    {
        int mij = (st + dr) / 2;
        //cout<<st<<" "<<dr<<"  "<<mij<<'\n';

        if(check(mij) == true)
            st = mij + 1;
        else
            dr = mij - 1;
        //cout<<" "<<st<<" "<<dr<<"  "<<mij<<'\n';
    }

    cout<<(st + dr) / 2;


    return 0;
}