Cod sursa(job #2567109)

Utilizator petrisorvmyVamanu Petru Gabriel petrisorvmy Data 3 martie 2020 15:13:48
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.87 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], ans;
int stopx, stopy;
int di[] = {1,0,-1,0};
int dj[] = {0,1,0,-1};
char c;
queue <pi> Qdrag;
deque <pi> Q;

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';
}
int main()
{
    f >> n >> m;
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= m; ++j)
        {
            dist_drag[i][j] = 1e9;
            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] = 0;
                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] == 1e9)
            {
                dist_drag[iN][jN] = dist_drag[i][j] + 1;
                Qdrag.push({iN,jN});
            }

        }
    }

    ans = dist_drag[startx][starty];
    Q.push_back({startx, starty});
    while(!Q.empty())
    {
        pi act = Q.front();
        Q.pop_front();
        ans = min(ans, dist_drag[act.first][act.second]);
        if(act == make_pair(stopx, stopy))
        {
            g << ans << '\n';
            return 0;
        }
        for(int k = 0; k < 4; ++k)
        {
            int iN = act.first + di[k];
            int jN = act.second + dj[k];
            if(ok(iN,jN) && viz[iN][jN] ==0)
            {
                viz[iN][jN] = 1;
                if(dist_drag[iN][jN] >= ans)
                    Q.push_front({iN,jN});
                else
                    Q.push_back({iN,jN});
            }
        }
    }
    g << -1;
    f.close();
    g.close();
    return 0;
}