Cod sursa(job #3238531)

Utilizator GabrielPopescu21Silitra Gabriel - Ilie GabrielPopescu21 Data 26 iulie 2024 13:55:54
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.39 kb
#include <bits/stdc++.h>
using namespace std;

const int dy[] = {-1, 1, 0, 0}, dx[] = {0, 0, -1, 1};
char a[1005][1005];
int dist[1005][1005], visited[1005][1005], n, m;

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

int bfs(int ys, int xs, int yf, int xf, int value)
{
    if (dist[ys][xs] < value || dist[yf][xf] < value)
        return 0;

    queue<pair<int,int>> q;

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

    q.push({ys, xs});
    visited[ys][xs] = 1;

    while (!q.empty())
    {
        int i = q.front().first;
        int j = q.front().second;
        q.pop();
        for (int k = 0; k < 4; ++k)
        {
            int y = i + dy[k];
            int x = j + dx[k];
            if (inside(y, x) && a[y][x] != '*' && !visited[y][x] && dist[y][x] >= value)
            {
                visited[y][x] = 1;
                q.push({y, x});
            }
        }
    }

    return visited[yf][xf];
}

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

    queue<pair<int,int>> q2;
    int ys, xs, yf, xf;
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= m; ++j)
        {
            char c;
            cin >> c;

            if (c == 'I')
                ys = i, xs = j;
            else if (c == 'O')
                yf = i, xf = j;
            else if (c == 'D')
            {
                q2.push({i, j});
                visited[i][j] = 1;
            }

            a[i][j] = c;
        }

    while (!q2.empty())
    {
        int i = q2.front().first;
        int j = q2.front().second;
        q2.pop();
        for (int k = 0; k < 4; ++k)
        {
            int y = i + dy[k];
            int x = j + dx[k];
            if (inside(y, x) && a[y][x] != '*' && !visited[y][x])
            {
                dist[y][x] = dist[i][j] + 1;
                visited[y][x] = 1;
                q2.push({y, x});
            }
        }
    }

    int left = 1, right = 1e6, ans = -1;
    while (left <= right)
    {
        int middle = left + (right - left) / 2;
        if (bfs(ys, xs, yf, xf, middle))
        {
            ans = middle;
            left = middle + 1;
        }
        else
            right = middle - 1;
    }

    cout << ans;

    return 0;
}