Cod sursa(job #2498794)

Utilizator YusyBossFares Yusuf YusyBoss Data 24 noiembrie 2019 13:57:57
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.11 kb
#include <fstream>

using namespace std;

int n, m, ok, lin, col, dr;
int di[] = {0,  0, 1, -1};
int dj[] = {1, -1, 0,  0};
char mat[1001][1001];
bool f[1001][1001];
int c1[1000001], c2[1000001], dist[1001][1001];

void initializare_dist() {
  int i, j;
  for (i = 1; i <= n; i++)
    for (j = 1; j <= m; j++)
      dist[i][j] = -1;
}

bool test (int lin, int col) {
  if (lin > 0 && lin <= n && col > 0 && col <= m && mat[lin][col] != '*' && dist[lin][col] == -1)
    return 1;
  return 0;
}

void bfs() {
  int i, cnt, st;
  cnt = 1;
  st = 0;
  while (st < dr) {
    for (i = 0; i < 4; i++) {
      if (test(c1[st] + di[i], c2[st] + dj[i])) {
        cnt++;
        c1[dr] = c1[st] + di[i];
        c2[dr++] = c2[st] + dj[i];
        dist[c1[st] + di[i]][c2[st] + dj[i]] = 1 + dist[c1[st]][c2[st]];
      }
    }
    st++;
  }
}

void reset() {
  int i, j;
  for (i = 0; i < n; i++)
    for (j = 0; j < m; j++)
      f[i][j] = 0;
}

void dfs(int l, int c, int x) {
  int i, l1, c1;
  if (l == 6 && c == 8 && x == 3)
    i = 3;
  if (ok == 1)
    return;
  f[l][c] = 1;
  for (i = 0; i < 4; i++) {
    l1 = l + di[i];
    c1 = c + dj[i];
    if (mat[l1][c1] == 'O') {
      ok = 1;
      return;
    }
    if (f[l1][c1] == 0 && dist[l1][c1] >= x && mat[l1][c1] == '.')
      dfs(l1, c1, x);
  }
}

int caut_bin() {
  int st, dr, mij, sol;
  st = 1;
  dr = n * m;
  sol = -1;
  while (st <= dr) {
    mij = (st + dr) / 2;
    ok = 0;
    dfs(lin, col, mij);
    if (ok == 1) {
      sol = mij;
      st = mij + 1;
    }
    else
      dr = mij - 1;
    reset();
  }
  return sol;
}

int main() {
  ifstream cin ("barbar.in");
  ofstream cout ("barbar.out");
  int i, j;
  cin >> n >> m;
  initializare_dist();
  for (i = 1; i <= n; i++) {
    cin.get();
    for (j = 1; j <= m; j++) {
      mat[i][j] = cin.get();
      if (mat[i][j] == 'D') {
        dist[i][j] = 0;
        c1[dr] = i;
        c2[dr++] = j;
      }
      if (mat[i][j] == 'I') {
        lin = i;
        col = j;
      }
    }
  }
  bfs();
  cout << caut_bin();
  return 0;
}