Pagini recente » Cod sursa (job #2277137) | Cod sursa (job #604320) | Cod sursa (job #2778239) | Cod sursa (job #1284074) | Cod sursa (job #2468660)
#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 == '*')
mat[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;
}