Cod sursa(job #2810863)

Utilizator Andrei_ierdnANeculau Rares-Andrei Andrei_ierdnA Data 30 noiembrie 2021 14:03:29
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.39 kb
#include <fstream>
#include <queue>

using namespace std;

ifstream f("barbar.in");
ofstream g("barbar.out");

struct pereche
{
    int x, y;
};

int r, c, i, j, x, y, st, dr, m, sol = -1;
int d[1010][1010];
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
char temnita[1010][1010];
bool blocat[1010][1010];
bool viz[1010][1010];
queue<pereche> q;
pereche start, finish, p1;

bool ok (int i, int j)
{
    return (i >= 1 && i <= r && j >= 1 && j <= c && temnita[i][j] != '*' && d[i][j] == -1);
}

bool ok2 (int i, int j, int nr)
{
    return (i >= 1 && i <= r && j >= 1 && j <= c && temnita[i][j] != '*' && !viz[i][j] && d[i][j] >= nr);
}

bool traseu (int nr)
{
    if (d[start.x][start.y] < nr)
        return false;
    q.push(start);
    viz[start.x][start.y] = true;
    while (!q.empty()) {
        p1 = q.front();
        if (p1.x == finish.x && p1.y == finish.y)
            break;
        for (i = 0; i < 4; i++) {
            x = p1.x + dx[i];
            y = p1.y + dy[i];
            if (ok2(x, y, nr)) {
                viz[x][y] = true;
                q.push({x, y});
            }
        }
        q.pop();
    }
    while (!q.empty())
        q.pop();
    for (i = 1; i <= r; i++)
        for (j = 1; j <= c; j++)
            viz[i][j] = false;
    if (p1.x == finish.x && p1.y == finish.y)
        return true;
    return false;
}

int main()
{
    f >> r >> c;
    for (i = 1; i <= r; i++) {
        f >> (temnita[i] + 1);
        for (j = 1; j <= c; j++) {
            d[i][j] = -1;
            if (temnita[i][j] == 'D') {
                d[i][j] = 0;
                q.push({i, j});
            }
            else if (temnita[i][j] == 'I')
                start = {i, j};
            else if (temnita[i][j] == 'O')
                finish = {i, j};
        }
    }
    while (!q.empty()) {
        p1 = q.front();
        for (i = 0; i < 4; i++) {
            x = p1.x + dx[i];
            y = p1.y + dy[i];
            if (ok(x, y)) {
                d[x][y] = d[p1.x][p1.y] + 1;
                q.push({x, y});
            }
        }
        q.pop();
    }
    st = 1;
    dr = r * c;
    while (st <= dr) {
        m = (st + dr) / 2;
        if (traseu(m)) {
            sol = m;
            st = m + 1;
        }
        else
            dr = m - 1;
    }
    g << sol;
    f.close();
    g.close();
    return 0;
}