Cod sursa(job #2634175)

Utilizator stefan.popescuPopescu Stefan stefan.popescu Data 10 iulie 2020 00:01:43
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <iostream>
#include <fstream>
#include <bitset>
#include <queue>
#include <vector>
using namespace std;
ifstream in ("barbar.in");
ofstream out("barbar.out");
int n, m, xi, yi, xf, yf;
const int oo=2e9;
char val;
int distMinDragon[1002][1002];
int dp[1002][1002];
int dx[]={0, 1, 0, -1, 0}, dy[]={0, 0, 1, 0, -1};
bitset <1003> barrier[1003];
queue <pair <short, short> > q;
priority_queue < pair <int, pair<short, short> > > pq;
int main()
{
    in>>n>>m;
    for(int i=0; i<=n+1; i++)
        barrier[i][0]=barrier[i][m+1]=1;

    for(int i=0; i<=m+1; i++)
        barrier[0][i]=barrier[n+1][i]=1;

    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
        {
            distMinDragon[i][j]=oo;
            dp[i][j]=-1;
            in>>val;
            if(val=='*')
                barrier[i][j]=1;
            else if(val=='I')
                xi=i, yi=j;
            else if(val=='O')
                xf=i, yf=j;
            else if(val=='D')
                distMinDragon[i][j]=0, q.push({i, j});
        }

    while(!q.empty())
    {
        auto per=q.front();
        q.pop();
        for(int i=1; i<=4; i++)
        {
            int xx=per.first+dx[i], yy=per.second+dy[i];
            if(!barrier[xx][yy])
                if(distMinDragon[per.first][per.second]+1<distMinDragon[xx][yy])
                    distMinDragon[xx][yy]=distMinDragon[per.first][per.second]+1, q.push({xx, yy});
        }
    }

    dp[xi][yi]=distMinDragon[xi][yi];
    pq.push({dp[xi][yi], {xi, yi}});
    while(!pq.empty())
    {
        auto per=pq.top();
        pq.pop();
        for(int i=1; i<=4; i++)
        {
            int xx=per.second.first+dx[i], yy=per.second.second+dy[i];
            if(!barrier[xx][yy])
                if(dp[xx][yy]<min(dp[per.second.first][per.second.second], distMinDragon[xx][yy]))
                {
                    dp[xx][yy]=min(dp[per.second.first][per.second.second], distMinDragon[xx][yy]);
                    pq.push({dp[xx][yy], {xx, yy}});
                }
        }
    }
    out<<dp[xf][yf];

    return 0;
}