Pagini recente » Cod sursa (job #1653902) | Cod sursa (job #3256197) | Cod sursa (job #410553) | Cod sursa (job #2567547) | Cod sursa (job #2468580)
#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;
string 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++){
f >> s;
for(j = 0 ; j < m ; j++)
if(s[j] == 'I')
start = make_pair(i, j + 1);
else
if(s[j] == 'O')
stop = make_pair(i, j + 1);
else
if(s[j] == 'D'){
dragon[i][j + 1] = 1;
d.push_back(make_pair(i,j + 1));
}else
if(s[j] == '*')
mat[i][j + 1] = -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]){
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, 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;
}