Pagini recente » Cod sursa (job #2894887) | Cod sursa (job #2538944) | Cod sursa (job #1856001) | Cod sursa (job #2913235) | Cod sursa (job #2468656)
#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;
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));
}
}
}
}
for(i = 1 ; i <= n ; i++)
for(j = 1 ; j <= m ; j++)
dragon[i][j]--;
int lo = 1, hi = n * m * 2, mid;
ans = inf;
while(lo <= hi){
mid = (lo + hi) / 2;
for(i = 1 ; i <= n ; i++)
for(j = 1 ; j <= m ; j++)
viz[i][j] = 0;
d.clear();
d.push_back(start);
while(!d.empty() && !viz[stop.first][stop.second]){
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(!viz[nx][ny] && dragon[nx][ny] >= mid && !mat[nx][ny]){
viz[nx][ny] = 1;
d.push_back(make_pair(nx,ny));
}
}
}
}
if(viz[stop.first][stop.second]){
ans = mid;
lo = mid + 1;
}else
hi = mid - 1;
}
if(ans != inf)
g << ans;
else
g << -1;
return 0;
}