Cod sursa(job #3276925)

Utilizator mirceamaierean41Mircea Maierean mirceamaierean41 Data 15 februarie 2025 10:14:34
Problema Barbar Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.11 kb
#include <fstream>
#include <queue>
#include <string.h>
using namespace std;

ifstream fin("barbar.in");
ofstream fout("barbar.out");

typedef pair<int, int> p;

int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, 1, -1};

const int NMAX = 1e3 + 3;

char a[NMAX][NMAX], viz[NMAX][NMAX];
int dist[NMAX][NMAX], n, m, xp, yp, xo, yo;

queue<p> q;

inline bool ok(int x, int y)
{
    return x && y && x <= n && y <= m && viz[x][y] == 0;
}

void Lee()
{
    while (!q.empty())
    {
        int x = q.front().first, y = q.front().second;
        q.pop();
        viz[x][y] = 1;
        for (int i = 0; i < 4; ++i)
        {
            int nx = x + dx[i], ny = y + dy[i];
            if (ok(nx, ny) && a[nx][ny] != '*' && dist[nx][ny] == 0)
            {
                dist[nx][ny] = dist[x][y] + 1;
                q.push({nx, ny});
            }
        }
    }
}

int valid()
{
    int mini = dist[xp][yp];
    priority_queue<pair<int, p>, vector<pair<int, p>>> pq;
    pq.push({dist[xp][yp], {xp, yp}});
    while (!pq.empty())
    {
        int x = pq.top().second.first, y = pq.top().second.second;
        int d = pq.top().first;

        viz[x][y] = 1;

        pq.pop();

        if (x == xo && y == yo)
            return mini;

        if (d < mini)
            mini = d;

        for (int i = 0; i < 4; ++i)
        {
            int nx = x + dx[i], ny = y + dy[i];
            if (ok(nx, ny) && a[nx][ny] != '*' && a[nx][ny] != 'D')
            {
                pq.push({dist[nx][ny], {nx, ny}});
            }
        }
    }
    return -1;
}

int main()
{
    fin >> n >> m;
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= m; ++j)
        {
            fin >> a[i][j];
            if (a[i][j] == 'D')
            {
                viz[i][j] = 1;
                q.push({i, j});
            }
            else if (a[i][j] == 'I')
            {
                xp = i;
                yp = j;
            }
            else if (a[i][j] == 'O')
            {
                xo = i;
                yo = j;
            }
        }

    Lee();

    memset(viz, 0, sizeof(viz));
    int res = valid();
    fout << res << "\n";

    return 0;
}