Pagini recente » Cod sursa (job #2022199) | Cod sursa (job #1768061) | Cod sursa (job #2190912) | Cod sursa (job #1050844) | Cod sursa (job #2016417)
#include <bits/stdc++.h>
using namespace std;
int di[5] = {-1, 1, 0, 0}, dj[5] = {0, 0, -1, 1};
int n, m, d[1010][1010], x, y, xx, yy, gg, wp, st, dr, mid;
bool viz[1010][1010], seen[1010][1010];
pair <int, int> w;
string s;
queue <pair <int, int> > q;
bool check(int v){
if(d[x][y] < v) return 0;
for(int i = 0; i <= n + 1; i++)
for(int j = 0; j <= m + 1; j++) seen[i][j] = viz[i][j];
q.push({x, y});
seen[x][y] = 1;
while(!q.empty()){
w = q.front();
if(w.first == xx && w.second == yy) return 1;
q.pop();
for(int k = 0; k < 4; k++){
gg = w.first + di[k];
wp = w.second + dj[k];
if(!seen[gg][wp] && d[gg][wp] >= v){
seen[gg][wp] = 1;
q.push({gg, wp});
}
}
}
return 0;
}
int main(){
ifstream in("barbar.in");
ofstream out("barbar.out");
in >> n >> m;
for(int i = 1; i <= n; i++){
in >> s;
for(int j = 1; j <= m; j++ ){
if(s[j-1] != '.') viz[i][j] = 1;
if(s[j-1] == 'I') x = i, y = j, viz[i][j] = 0;
if(s[j-1] == 'O') xx = i, yy = j, viz[i][j] = 0;
if(s[j-1] == 'D') q.push({i, j});
}
}
for(int i = 0; i <= n + 1; i++) viz[i][0] = viz[i][m+1] = 1;
for(int i = 0; i <= m + 1; i++) viz[0][i] = viz[n+1][i] = 1;
for(int i = 0; i <= n + 1; i++)
for(int j = 0; j <= m + 1; j++) seen[i][j] = viz[i][j];
while(!q.empty()){
w = q.front();
q.pop();
for(int k = 0; k < 4; k++){
gg = w.first + di[k];
wp = w.second + dj[k];
if(!seen[gg][wp]){
seen[gg][wp] = 1;
d[gg][wp] = d[w.first][w.second] + 1;
q.push({gg, wp});
}
}
}
st = 1; dr = 1e6;
while(st <= dr){
mid = (st + dr) / 2;
if(check(mid)) st = mid + 1;
else dr = mid - 1;
}
if(!check(1)) out << "-1";
else out << dr;
return 0;
}