Cod sursa(job #2501985)

Utilizator NoemikulcsarKulcsar Noemi Noemikulcsar Data 30 noiembrie 2019 12:24:53
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.34 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 1005;
const int inf = 2e9;
const int dx[] = {-1, 0, 1, 0};
const int dy[] = {0, -1, 0, 1};
int mat[NMAX][NMAX],viz[NMAX][NMAX], dragon[NMAX][NMAX];
int n,m,ans;
char s;
deque < pair < int, int > > d;
pair <int, int> start,stop;
struct Pair {
    int x, y;
    bool operator < (const Pair &alt) const
    {   return dragon[x][y] > dragon[alt.x][alt.y];  }
};
priority_queue < Pair > pq;

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

int main(){
    int i,j,x,y,nx,ny;
    f >> n >> m;
    for(i = 1 ; i <= n ; i++){
        for(j = 1 ; j <= m ; j++){
            f >> s;
            if(s == 'I')
                start = make_pair(i, j);
            else
                if(s == 'O')
                    stop = make_pair(i, j);
                else
                    if(s == 'D'){
                        dragon[i][j] = 1;
                        d.push_back(make_pair(i,j));
                    }else
                        if(s == '*')
                            dragon[i][j] = -1;

        }
    }

    while(!d.empty()){
        x = d.front().first;
        y = d.front().second;
        d.pop_front();

        for(i = 0 ; i < 4 ; i++){
            nx = x + dx[i];
            ny = y + dy[i];

            if(inside(nx,ny)){
                if(!dragon[nx][ny] && inside(nx,ny)){
                    dragon[nx][ny] = dragon[x][y] + 1;
                    d.push_back(make_pair(nx,ny));
                }
            }
        }
    }

    bool ok = 0;
    ans = dragon[start.first][start.second];
    dragon[start.first][start.second] *= -1;
    pq.push({start.first, start.second});
    while(!pq.empty()){
        x = pq.top().x;
        y = pq.top().y;
        pq.pop();

        if(x == stop.first && y == stop.second){
            ok = 1;
            break;
        }
        ans = min(ans, -dragon[x][y]);

        for(i = 0 ; i < 4 ; i++){
            nx = x + dx[i];
            ny = y + dy[i];

            if(inside(nx,ny) && dragon[nx][ny] > 1){
                dragon[nx][ny] *= -1;
                pq.push({nx,ny});
            }
        }
    }
    if(ok == 0)
        g << -1;
    else
        g << ans - 1;

    return 0;
}