Pagini recente » Profil HaripAlex | Profil M@2Te4i | Monitorul de evaluare | Istoria paginii utilizator/oana2598 | Cod sursa (job #2210347)
#include <bits/stdc++.h>
using namespace std;
int n, m;
int l1, c1, l2, c2;
int d[1005][1005];
int T[1005][1005];
char s[1005][1005];
short dx[] = {0, 0, -1, 1};
short dy[] = {-1, 1, 0, 0};
queue <pair <int, int> > q;
inline void prec(){
while(!q.empty()){
int l = q.front().first, c = q.front().second;
q.pop();
for(short k = 0; k < 4 ; ++k){
int l1 = l + dx[k];
int c1 = c + dy[k];
if(!(l1 >= 0 && c1 >= 0 && l1 < n && c1 < m) || s[l1][c1] == '*') continue ;
if(d[l1][c1] > d[l][c] + 1) {
d[l1][c1] = d[l][c] + 1;
q.push({l1, c1});
}
}
}
}
inline void lee(){
memset(T, -1, sizeof(T));
q.push({l1, c1});
T[l1][c1] = d[l1][c1];
while(!q.empty()){
int l = q.front().first, c = q.front().second;
q.pop();
for(short k = 0; k < 4 ; ++k){
int l1 = l + dx[k];
int c1 = c + dy[k];
if(!(l1 >= 0 && c1 >= 0 && l1 < n && c1 < m) || s[l1][c1] == '*') continue ;
if(T[l1][c1] < min(T[l][c], d[l1][c1])) {
T[l1][c1] = min(T[l][c], d[l1][c1]);
if(l1 == l2 && c1 == c2) continue ;
q.push({l1, c1});
}
}
}
}
int main()
{
freopen("barbar.in", "r", stdin);
freopen("barbar.out", "w", stdout);
scanf("%d%d", &n, &m);
memset(d, 0x3f, sizeof(d));
for(int i = 0; i < n ; ++i){
scanf("%s", s[i]);
for(int j = 0; j < m ; ++j){
if(s[i][j] == 'D') q.push({i, j}), d[i][j] = 0;
if(s[i][j] == 'I') l1 = i, c1 = j;
if(s[i][j] == 'O') l2 = i, c2 = j;
}
}
prec();
lee();
printf("%d", T[l2][c2]);
return 0;
}