Pagini recente » Istoria paginii utilizator/watersword | Cod sursa (job #1590789) | Cod sursa (job #1921776) | Cod sursa (job #2387979) | Cod sursa (job #2634175)
#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;
}