Pagini recente » Cod sursa (job #1981217) | Borderou de evaluare (job #2830531) | Cod sursa (job #2256553) | Cod sursa (job #2071110) | Cod sursa (job #2403026)
#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;
}