Cod sursa(job #2828647)

Utilizator Edyci123Bicu Codrut Eduard Edyci123 Data 7 ianuarie 2022 18:42:07
Problema Barbar Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.47 kb
#include <bits/stdc++.h>
#define DIM 1005
#define PII pair <int, int>

using namespace std;

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

int n, m, distDrake[DIM][DIM], dist[DIM][DIM];
char s[DIM][DIM];
PII start, finish;
queue <PII> q;
int dl[] = {0, 1, 0, -1}, dc[] = {1, 0, -1, 0};

bool valid(int x, int y)
{
    return x >= 1 && x <= n && y >= 1 && y <= m;
}

void init()
{
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
        {
            if (s[i][j] == '*')
                dist[i][j] = -1;
            else if (s[i][j] == 'I')
                dist[i][j] = 1;
            else
                dist[i][j] = 0;
        }
}

void bfsDrakes()
{
    while (!q.empty())
    {
        PII nod = q.front();
        q.pop();

        for (int i = 0; i < 4; i++)
        {
            PII newNod = {nod.first + dl[i], nod.second + dc[i]};
            if (valid(newNod.first, newNod.second) && distDrake[newNod.first][newNod.second] == 0)
            {
                distDrake[newNod.first][newNod.second] = distDrake[nod.first][nod.second] + 1;
                q.push(newNod);
            }
        }
    }
}

bool bfs(int distMin)
{
    init();
    q.push(start);
    while (!q.empty())
    {
        PII nod = q.front();
        q.pop();

        for (int i = 0; i < 4; i++)
        {
            PII newNod = {nod.first + dl[i], nod.second + dc[i]};
            if (valid(newNod.first, newNod.second) && distDrake[newNod.first][newNod.second] >= distMin && dist[newNod.first][newNod.second] == 0)
            {
                dist[newNod.first][newNod.second] = dist[nod.first][nod.second] + 1;
                q.push(newNod);
            }
        }
    }
    if (dist[finish.first][finish.second])
        return 1;
    else
        return 0;
}

int main()
{
    f >> n >> m;

    for (int i = 1; i <= n; i++)
    {
        f >> s[i] + 1;
        for (int j = 1; j <= n; j++)
        {
            if (s[i][j] == 'I')
                start = {i, j};
            else if (s[i][j] == 'D')
                q.push({i, j}), distDrake[i][j] = 1;
            else if (s[i][j] == 'O')
                finish = {i, j};
        }
    }

    bfsDrakes();

    int st = 1, dr = n * m, ans = 0;
    while (st <= dr)
    {
        int mid = (st + dr) / 2;
        if (bfs(mid))
            ans = mid, st = mid + 1;
        else
            dr = mid - 1;
    }


    g << ans - 1;

    return 0;
}