Pagini recente » Cod sursa (job #1211737) | Cod sursa (job #306368) | Cod sursa (job #2928497) | Cod sursa (job #2409421) | Cod sursa (job #2468402)
//wish me luck
#include <bits/stdc++.h>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
const int dx[] = {-1, 0, 1, 0};
const int dy[] = {0, -1, 0, 1};
const int NMAX = 1005;
const int inf = 1e9;
pair <int, int> start, stop;
int n,m,dragon[NMAX][NMAX],mat[NMAX][NMAX];
bool viz[NMAX][NMAX];
string s;
deque < pair <int, int> > d;
bool inside(int x, int y){
return (x >= 1 && y >= 1 && x <= n && y <= m);
}
void bfs(){
int x,y,nx,ny,i;
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) && !dragon[nx][ny]){
dragon[nx][ny] = dragon[x][y] + 1;
d.push_back(make_pair(nx,ny));
}
}
}
}
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'){
d.push_back(make_pair(i,j + 1));
dragon[i][j + 1] = 1;
}else
if(s[j] == '*'){
mat[i][j + 1] = -1;
}
}
bfs();
for(i = 1 ; i <= n ; i++)
for(j = 1 ; j <= m ; j++)
dragon[i][j]--;
int lo = 1, hi = 2 * inf, mid,ans = inf ;
while(lo <= hi){
d.push_back(start);
mid = (lo + hi) / 2;
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) && !viz[nx][ny] && dragon[nx][ny] >= mid && mat[nx][ny] != -1){
viz[nx][ny] = 1;
d.push_back(make_pair(nx,ny));
}
}
}
if(viz[stop.first][stop.second]){
lo = mid + 1;
ans = mid;
}else
hi = mid - 1;
for(i = 1 ; i <= n ; i++)
for(j = 1 ; j <= m ; j++)
viz[i][j] = 0;
}
if(ans != inf || ans > m * n)
g << ans;
else
g << -1;
return 0;
}