Cod sursa(job #2566904)

Utilizator petrisorvmyVamanu Petru Gabriel petrisorvmy Data 3 martie 2020 13:49:39
Problema Barbar Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.97 kb
#include <bits/stdc++.h>
#define FILE_NAME "barbar"
#define fast ios_base :: sync_with_stdio(0); cin.tie(0);
#pragma GCC optimize("O3")
#define NMAX 1010
using namespace std;

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

typedef long long ll;
typedef long double ld;
typedef pair<int,int> pi;
typedef pair<ld,ld> pct;

const ll inf = 1LL << 60;
const ll mod = 1e9 + 7;
const ld eps = 1e-9;


void add(ll &a , ll b)
{
    a += b;
    a %= mod;
}

void sub(ll &a, ll b)
{
    a = (a - b + mod) % mod;
}

int n, m, d[NMAX][NMAX], viz[NMAX][NMAX], startx, starty,dist_drag[NMAX][NMAX];
int stopx, stopy;
int di[] = {1,0,-1,0};
int dj[] = {0,1,0,-1};
char c;
queue <pi> Qdrag;

inline bool ok(int i, int j)
{
    if(i < 1 || i > n || j < 1 || j > m)
        return 0 ;
    return 1;
}
void printmatrix(int a[][NMAX])
{
    for(int i = 1; i <= n; ++i, g<< '\n')
        for(int j = 1; j <= m; ++j)
            g << a[i][j] << ' ';
    g << '\n';
}
struct cmp
{
    bool operator() (pi a, pi b)
    {
        if( d[a.first][a.second] >= d[b.first][b.second])
            return 1;
        else
            return 0;
    }
};
priority_queue <pi, vector <pi>, cmp > Q;
int main()
{
    f >> n >> m;
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= m; ++j)
        {
            f >> c;
            if(c == 'I')
            {
                startx = i;
                starty = j;
            }
            else if(c == '*')
            {
                viz[i][j] = -1;
            }
            else if(c == 'O')
            {
                stopx = i;
                stopy = j;
            }
            else if(c == 'D')
            {
                dist_drag[i][j] = 1;
                Qdrag.push({i,j});
            }
        }
    while(!Qdrag.empty())
    {
        int i,j;
        i = Qdrag.front().first;
        j = Qdrag.front().second;
        Qdrag.pop();
        for(int k = 0; k < 4; ++k)
        {
            int iN = i + di[k];
            int jN = j + dj[k];
            if(ok(iN,jN) && dist_drag[iN][jN] == 0)
            {
                dist_drag[iN][jN] = dist_drag[i][j] + 1;
                Qdrag.push({iN,jN});
            }

        }
    }
    Q.push({startx, starty});
    viz[startx][starty] = 1;
    d[startx][starty] = dist_drag[startx][starty];
    while(!Q.empty())
    {
        int i,j;
        i = Q.top().first;
        j = Q.top().second;
        Q.pop();
        for(int k = 0; k < 4; ++k)
        {
            int iN = i + di[k];
            int jN = j + dj[k];
            if(ok(iN,jN) &&  min(d[i][j], dist_drag[iN][jN]) > d[iN][jN] )
            {
                viz[iN][jN] = 1;
                d[iN][jN] = min(d[i][j], dist_drag[iN][jN]);
                Q.push({iN,jN});
            }

        }
    }
    //printmatrix(dist_drag);
    //printmatrix(d);
    g << d[stopx][stopy] - 1<< '\n';
    f.close();
    g.close();
    return 0;
}