Cod sursa(job #3276931)

Utilizator mirceamaierean41Mircea Maierean mirceamaierean41 Data 15 februarie 2025 10:18:18
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.2 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});
            }
        }
    }
}

struct cmp
{
    bool operator()(const pair<int, int> &a, const pair<int, int> &b)
    {
        return dist[a.first][a.second] < dist[b.first][b.second];
    }
};

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

        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) && dist[nx][ny] > 0)
            {
                viz[nx][ny] = 1;
                pq.push({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;
}