Pagini recente » Cod sursa (job #1565391) | Cod sursa (job #131372) | Cod sursa (job #2225698) | Cod sursa (job #551649) | Cod sursa (job #2735091)
#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];
per in, o, v[lmax * lmax];
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')
v[++nr] = {i, j};
}
bool lim(int i, int j){
return (i >= 1 && i <= n && j >= 1 && j <= m);
}
void filll(int l, int c, int d){
for(int i = 0; i < 4; i++){
int l1 = l + dx[i];
int c1 = c + dy[i];
if(lim(l1, c1) && a[l1][c1] != '*' && vis[l][c] < d && !vis[l1][c1]){
vis[l1][c1] = vis[l][c] + 1;
filll(l1, c1, d);
}
}
}
bool bfs(){
queue <per> q;
q.push(in);
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] != '*' && !vis[l][c]){
vis[l][c] = 1;
q.push({l, c});
}
}
}
return false;
}
bool okay(int d){
memset(vis, 0, sizeof(vis));
for(int i = 1; i <= nr; i++){
vis[v[i].first][v[i].second] = 1;
filll(v[i].first, v[i].second, d);
}
return (bfs());
}
void solve(){
int l = 1, r = lmax * lmax, sol = -1;
while(l <= r){
int mid = (l + r) / 2;
if(okay(mid)){
sol = mid;
l = mid + 1;
} else
r = mid - 1;
}
fout << sol;
}
int main()
{
read();
dragons();
solve();
return 0;
}