Cod sursa(job #2923786)

Utilizator smunteanuMunteanu Stefan Catalin smunteanu Data 19 septembrie 2022 09:44:30
Problema Barbar Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.79 kb
#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;
  


}