Cod sursa(job #3242528)

Utilizator IanisBelu Ianis Ianis Data 12 septembrie 2024 15:40:13
Problema Barbar Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.52 kb
#include <bits/stdc++.h>

using namespace std;

#ifdef LOCAL
ifstream fin("input.txt");
#define fout cout
#else
ifstream fin("barbar.in");
ofstream fout("barbar.out");
#endif

#define fi first
#define se second

#define sz(a) int((a).size())
#define all(a) (a).begin(), (a).end()

using ll = long long;
using pii = pair<int, int>;

const int NMAX = 1005;
const int INF  = 1e9+5;

const int dx[] = { 1, -1, 0, 0 };
const int dy[] = { 0, 0, 1, -1 };

int n, m;
int sx, sy;
int tx, ty;
char a[NMAX][NMAX];
int dd[NMAX][NMAX];
int dist[NMAX][NMAX];

void read() {
   fin >> n >> m;
   for (int i = 1; i <= n; i++) {
      fin >> (a[i] + 1);
   }
}

bool good(int min_dist) {
   for (int i = 1; i <= n; i++) {
      fill(dist[i] + 1, dist[i] + m + 1, INF);
   }

   queue<pii> q;
   q.push({ sx, sy });
   dist[sx][sy] = 0;

   while (!q.empty()) {
      auto [ x, y ] = q.front();
      q.pop();

      if (x == tx && y == ty) {
         return true;
      }

      for (int k = 0; k < 4; k++) {
         if (a[x + dx[k]][y + dy[k]] == '.' &&
             dd[x + dx[k]][y + dy[k]] >= min_dist &&
             dist[x + dx[k]][y + dy[k]] > dist[x][y] + 1
            ) {
            dist[x + dx[k]][y + dy[k]] = dist[x][y] + 1;
            q.push({ x + dx[k], y + dy[k] });
         }
      }
   }

   return false;
}

int solve() {
   queue<pii> q;

   for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= m; j++) {
         dd[i][j] = INF;
         if (a[i][j] == 'D') {
            q.push({ i, j });
            dd[i][j] = 0;
         } else if (a[i][j] == 'I') {
            sx = i;
            sy = j;
            a[i][j] = '.';
         } else if (a[i][j] == 'O') {
            tx = i;
            ty = j;
            a[i][j] = '.';
         }
      }
   }

   while (!q.empty()) {
      auto [ x, y ] = q.front();
      q.pop();

      for (int k = 0; k < 4; k++) {
         if (a[x + dx[k]][y + dy[k]] == '.' && dd[x + dx[k]][y + dy[k]] > dd[x][y] + 1) {
            dd[x + dx[k]][y + dy[k]] = dd[x][y] + 1;
            q.push({ x + dx[k], y + dy[k] });
         }
      }
   }

   if (!good(1)) {
      return -1;
   }

   int l = 1, r = n + m;

   while (l <= r) {
      int mid = (l + r) >> 1;
      if (good(mid)) {
         l = mid + 1;
      } else {
         r = mid - 1;
      }
   }

   return r;
}

signed main() {
#ifdef LOCAL
   freopen("input.txt", "r", stdin);
#endif

   read();
   fout << solve() << endl;

   return 0;
}