Pagini recente » Cod sursa (job #719727) | Cod sursa (job #2983069) | Cod sursa (job #1473153) | Cod sursa (job #316482) | Cod sursa (job #2735126)
#include <bits/stdc++.h>
#define per pair<int,int>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int lmax = 1e3 + 5;
int n, m, nr, vis[lmax][lmax];
bool v[lmax][lmax];
queue <per> d;
per in, o;
char a[lmax][lmax];
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
void read(){
fin >> n >> m;
for(int i = 1; i <= n; i++)
fin >> (a[i] + 1);
}
void dragons(){
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
if(a[i][j] == 'I')
in = {i, j};
else if(a[i][j] == 'O')
o = {i, j};
else if(a[i][j] == 'D'){
vis[i][j] = 1;
d.push({i, j});
}
}
bool lim(int i, int j){
return (i >= 1 && i <= n && j >= 1 && j <= m);
}
void prec(){
while(!d.empty()){
per p = d.front();
d.pop();
for(int i = 0; i < 4; i++){
int l = p.first + dx[i];
int c = p.second + dy[i];
if(lim(l, c) && a[l][c] != '*' && !vis[l][c]){
vis[l][c] = vis[p.first][p.second] + 1;
d.push({l,c});
}
}
}
}
int mx(){
int nr = 0;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
nr = max(nr, vis[i][j]);
return nr;
}
bool bfs(int val){
memset(v, 0, sizeof(v));
queue <per> q;
q.push(in);
v[in.first][in.second] = 1;
while(!q.empty()){
per p = q.front();
q.pop();
if(p == o)
return true;
for(int i = 0; i < 4; i++){
int l = p.first + dx[i];
int c = p.second + dy[i];
if(lim(l, c) && a[l][c] != '*' && !v[l][c] && vis[l][c] > val){
v[l][c] = 1;
q.push({l, c});
}
}
}
return false;
}
void solve(){
int l = 1, r = mx(), sol = -1;
while(l <= r){
int mid = (l + r) / 2;
if(bfs(mid)){
sol = mid;
l = mid + 1;
} else
r = mid - 1;
}
fout << sol;
}
int main()
{
read();
dragons();
prec();
solve();
return 0;
}