Cod sursa(job #2646297)

Utilizator etohirseCristi Cretu etohirse Data 31 august 2020 18:00:29
Problema Barbar Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.19 kb
/**
 *    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;
}