Pagini recente » vendetta_dc4 | Profil adry_air | Rating virzob traneci bogdan (bbbogdannn) | Cod sursa (job #1651618) | Cod sursa (job #2923786)
#include <iostream>
#include <queue>
using namespace std;
typedef pair<int, int> ipair;
const int nmax = 1007;
const int di[4]{0,1,0,-1};
const int dj[4]{1,0,-1,0};
static int n, m, r;
static char s[nmax][nmax];
static bool v[nmax][nmax];
static int p[nmax][nmax];
static ipair src, dst;
void prt() {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++)
cout << v[i][j];
cout << endl;
}
}
int main() {
// freopen("file.in", "r", stdin);
ios_base::sync_with_stdio(false), cin.tie(NULL);
queue<ipair> qd;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> (s[i] + 1);
for (int j = 1; j <= m; j++) {
switch (s[i][j]) {
case 'D': qd.push({i, j}); p[i][j] = 1; break;
case 'I': src = {i, j}; break;
case 'O': dst = {i, j}; break;
}
}
}
while (!qd.empty()) {
auto [i, j] = qd.front(); qd.pop();
for (int k = 0; k < 4; k++) {
int ni = i + di[k], nj = j + dj[k];
if (1 <= ni && ni <= n && 1 <= nj && nj <= m) {
if (p[ni][nj] == 0) {
p[ni][nj] = p[i][j] + 1;
qd.push({ni, nj});
}
}
}
}
deque<ipair> q;
q.push_front(src);
v[src.first][src.second] = true;
r = min(p[src.first][src.second], p[dst.first][dst.second]);
while (!q.empty()) {
auto [i, j] = q.front(); q.pop_front();
r = min(r, p[i][j]);
for (int k = 0; k < 4; k++) {
int ni = i + di[k], nj = j + dj[k];
if (!(1 <= ni && ni <= n && 1 <= nj && nj <= m) || v[ni][nj] || s[ni][nj] == '*') continue;
if (ni == dst.first && nj == dst.second) { q.clear(); break; }
v[ni][nj] = true;
if (p[ni][nj] >= r) q.push_front({ni, nj});
else q.push_back({ni, nj});
}
}
cout << r - 1;
}