Cod sursa(job #2403026)

Utilizator alex2kamebossPuscasu Alexandru alex2kameboss Data 11 aprilie 2019 11:01:49
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.25 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <set>
#include <queue>
#include <bitset>

using namespace std;

int n,m,xi,yi,xf,yf;
vector <pair<int,int>> dr;
queue <pair<int,int>> q;
int dx[] = {0,0,-1,1};
int dy[] = {-1,1,0,0};
char c;
int d[1005][1005];
bitset <1005> viz[1005];
set <pair<int,pair<int,int>>, greater<pair<int,pair<int,int>>>> b;

void leeDragon(){
    while(!q.empty()){
        auto l = q.front();
        q.pop();
        for(int i = 0; i < 4; ++i){
            int nx = l.first + dx[i];
            int ny = l.second + dy[i];
            if(d[nx][ny]==0){
                d[nx][ny] = d[l.first][l.second] + 1;
                q.push({nx,ny});
            }else{
                d[nx][ny] = min(d[l.first][l.second] + 1, d[nx][ny]);
            }
        }
    }
}

void leeBrabar(){
    b.insert({d[xi][yi],{xi,yi}});
    viz[xi][yi]=1;
    while(!b.empty()){
        auto l = (*b.begin()).second;
        int t = (*b.begin()).first;
        b.erase(b.begin());
        for(int i = 0; i < 4; ++i){
            int nx = l.first + dx[i];
            int ny = l.second + dy[i];
            if(!viz[nx][ny]){
                viz[nx][ny]=1;
                b.insert({min(d[nx][ny], t),{nx,ny}});
            }
            if(nx == xf && ny == yf){
                cout<<min(d[nx][ny], t);
                return ;
            }
        }
    }
    cout<<"-1";
}

int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);

    scanf("%d%d", &n,&m);
    for(int i = 1; i <= n; ++i){
        scanf("\n");
        for(int j = 1; j<= m; ++j){
            scanf("%c", &c);
            if(c=='.')
                continue;
            else if(c=='I'){
                xi = i;
                yi = j;
            }else if(c=='D')
                q.push({i,j}), dr.push_back({i,j}), viz[i][j]=1;
            else if(c=='*')
                d[i][j] = -1;
            else{
                xf = i;
                yf = j;
            }
        }
    }

    for(int i = 0; i <= n+1; ++i)
        d[i][0] = d[i][m+1] = -1, viz[i][0] = viz[i][m+1] = 1;
    for(int j = 0; j <= m+1; ++j)
        d[0][j] = d[n+1][j] = -1, viz[0][j] = viz[n+1][j] = 1;

    leeDragon();
    for(auto i : dr)
        d[i.first][i.second] = 0;
    leeBrabar();

    return 0;
}