Pagini recente » Cod sursa (job #986607) | Cod sursa (job #1543599) | Cod sursa (job #2559761) | Cod sursa (job #2970808) | Cod sursa (job #2646297)
/**
* author: etohirse
* created: 31.08.2020 17:44:38
**/
// #include <climits>
// #include <fstream>
// #include <queue>
#include <bits/stdc++.h>
std::ifstream fin("barbar.in");
std::ofstream fout("barbar.out");
const int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, -1, 0};
int mat[1005][1005], dragon[1005][1005], n, m, sx, sy, fx, fy;
bool a[1005][1005];
std::deque<std::pair<int, int>> dq;
std::priority_queue<std::tuple<int, int, int>> pq;
bool ok(int i, int j) { return 0 <= i && 0 <= j && i < n && j < m; }
void bfsDragon() {
while (!dq.empty()) {
int i = dq.front().first;
int j = dq.front().second;
dq.pop_front();
for (int k = 0; k < 4; ++k) {
int ni = i + dx[k];
int nj = j + dy[k];
if (ok(ni, nj) && a[ni][nj] == 0 && dragon[ni][nj] > dragon[i][j] + 1) {
dragon[ni][nj] = 1 + dragon[i][j];
dq.push_back({ni, nj});
}
}
}
}
void bfsJucator() {
while (!pq.empty()) {
int i = std::get<1>(pq.top());
int j = std::get<2>(pq.top());
pq.pop();
for (int k = 0; k < 4; ++k) {
int ni = i + dx[k];
int nj = j + dy[k];
if (ok(ni, nj) && a[ni][nj] == 0 &&
mat[ni][nj] < std::min(mat[i][j], dragon[ni][nj])) {
mat[ni][nj] = std::min(mat[i][j], dragon[ni][nj]);
if (ni == fx and nj == fy) return;
pq.push(std::make_tuple(mat[ni][nj], ni, nj));
}
}
}
}
int main() {
fin >> n >> m;
std::string s;
char chr;
for (int i = 0; i < n; ++i) {
fin >> s;
for (int j = 0; j < m; ++j) {
dragon[i][j] = INT_MAX;
mat[i][j] = -1;
chr = s[j];
if (chr == '.') {
a[i][j] = 0;
continue;
}
if (chr == '*') {
a[i][j] = 1;
continue;
}
if (chr == 'I') {
a[i][j] = 0;
sx = i, sy = j;
continue;
}
if (chr == 'O') {
a[i][j] = 0;
fx = i, fy = j;
continue;
}
if (chr == 'D') {
dq.push_back({i, j});
a[i][j] = 0;
dragon[i][j] = 0;
continue;
}
}
}
bfsDragon();
mat[sx][sy] = dragon[sx][sy];
pq.push(std::make_tuple(mat[sx][sy], sx, sy));
bfsJucator();
fout << mat[fx][fy] << '\n';
return 0;
}