Cod sursa(job #2846094)

Utilizator tomaionutIDorando tomaionut Data 8 februarie 2022 19:15:27
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <bits/stdc++.h>
#define INF 1e9
using namespace std;

ifstream fin("barbar.in");
ofstream fout("barbar.out");
char s[1005][1005];
int n, m, d[1005][1005],xs,ys,xf,yf, ok;
bitset <1005> viz[1005];
queue <pair <int, int > > Q;
int dx[] = { 0,0,1,-1 };
int dy[] = { 1,-1,0,0 };
bool OK(int i, int j)
{
    return (1 <= i and i <= n and 1 <= j and j <= m);
}

void Fill(int x, int y, int val)
{
    if (ok == 1 and OK(x, y) and viz[x][y] == 0 and d[x][y] >= val and s[x][y] != '*')
    {
        viz[x][y] = 1;
        if (x == xf and y == yf)
            ok = 0;
        Fill(x - 1, y, val);
        Fill(x + 1, y, val);
        Fill(x, y - 1, val);
        Fill(x, y + 1, val);
    }
}

bool Check(int mij)
{
    int i, j;
    for (i = 1; i <= n; i++)
        viz[i].reset();
    ok = 1;
    Fill(xs, ys, mij);
    return viz[xf][yf];
}

int main()
{
    int i, j,x,y,k,st,dr,mij, sol = - 1;
    fin >> n >> m;
    for (i = 1; i <= n; i++)
        for (j = 1; j <= m; j++)
        {
            fin >> s[i][j];
            d[i][j] = INF;
            if (s[i][j] == 'I') { xs = i; ys = j; }
            else if (s[i][j] == 'O') { yf = j; xf = i; }
            else if (s[i][j] == 'D') { d[i][j] = 0; Q.push({ i,j }); }
        }

    while (!Q.empty())
    {
        x = Q.front().first;
        y = Q.front().second;
        Q.pop();
        for (k = 0; k <= 3; k++)
        {
            i = x + dx[k];
            j = y + dy[k];
            if (OK(i, j) and s[i][j] != '*' and d[i][j] > 1 + d[x][y])
            {
                d[i][j] = d[x][y] + 1;
                Q.push({ i,j });
            }
        }
    }
    
    st = 1;
    dr = d[xf][yf];
    while (st <= dr)
    {
        mij = (st + dr) / 2;
        if (Check(mij))
        {
            sol = mij;
            st = mij + 1;
        }
        else dr = mij - 1;
    }

    fout << sol << "\n";

    return 0;
}