Cod sursa(job #2986863)

Utilizator Alex_HossuHossu Alexandru Alex_Hossu Data 1 martie 2023 13:37:39
Problema Barbar Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.52 kb
#include <bits/stdc++.h>
using namespace std;

const int MAX_L = 1e3 + 5;

ifstream fin("barbar.in");
ofstream fout("barbar.out");

int a[MAX_L][MAX_L];

int dist[MAX_L][MAX_L];

char line[MAX_L];
void readData(int r, int c) {
  int i, j;
  for (i = 0; i < r; i++) {
    fin.getline(line, MAX_L);
    for (j = 0; j < c; j++)
      a[i][j] = line[j];
  }
}

struct Pos {
  int i;
  int j;
};
queue<Pos> que;

void fil(int i, int j, int r, int c) {
  dist[i][j] = -1;
  if (i - 1 >= 0 && dist[i - 1][j] == 0) {
    dist[i - 1][j] = -1; fil(i - 1, j, r, c);
  }
  if (j - 1 >= 0 && dist[i][j - 1] == 0) {
    dist[i][j - 1] = -1; fil(i, j - 1, r, c);
  }
  if (i + 1 < r && dist[i + 1][j] == 0) {
    dist[i + 1][j] = -1; fil(i + 1, j, r, c);
  }
  if (j + 1 < c && dist[i][j + 1] == 0) {
    dist[i][j + 1] = -1; fil(i, j + 1, r, c);
  }
}

bool verif(int distVar, int r, int c) {
  int i, j; Pos pos, first, last;
  for (i = 0; i < r; i++)
    for (j = 0; j < c; j++) {
      dist[i][j] = 0;
      if (a[i][j] == 'D') {
        dist[i][j] = 1;
        que.push({i, j});
      }
    }

  while (!que.empty()) {
    pos = que.front(); que.pop();
    i = pos.i; j = pos.j;
    if (dist[i][j] < distVar) {
      if (i - 1 >= 0 && dist[i - 1][j] == 0) {
        dist[i - 1][j] = dist[i][j] + 1;
        que.push({i - 1, j});
      }
      if (j - 1 >= 0 && dist[i][j - 1] == 0) {
        dist[i][j - 1] = dist[i][j] + 1;
        que.push({i, j - 1});
      }
      if (i + 1 < r && dist[i + 1][j] == 0) {
        dist[i + 1][j] = dist[i][j] + 1;
        que.push({i + 1, j});
      }
      if (j + 1 < c && dist[i][j + 1] == 0) {
        dist[i][j + 1] = dist[i][j] + 1;
        que.push({i, j + 1});
      }
    }
  }

  for (i = 0; i < r; i++)
    for (j = 0; j < c; j++)
      if (a[i][j] == 'I')
        first.i = i, first.j = j;
  i = first.i, j = first.j;
  fil(i, j, r, c);
  /*  for (i = 0; i < r; i++) {
    for (j = 0; j < c; j++)
      fout << dist[i][j] << ' ';
    fout << '\n';
  } */

  for (i = 0; i < r; i++)
    for (j = 0; j < c; j++)
      if (a[i][j] == 'O')
        last.i = i, last.j = j;
  i = last.i, j = last.j;
  return dist[i][j] == -1;
}

int main() {
  int r, c;
  int i, j;
  int st, dr, mij;

  fin >> r >> c;
  fin.getline(line, MAX_L);
  readData(r, c);

  st = 0; dr = max(r, c);
  while (dr - st > 1) {
    mij = (st + dr) / 2;
    if (verif(mij, r, c))
      st = mij;
    else
      dr = mij;
  }
  fout << st;

  return 0;
}