Cod sursa(job #2783875)

Utilizator YusyBossFares Yusuf YusyBoss Data 15 octombrie 2021 10:59:22
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.58 kb
#include <fstream>
#include <queue>
#define NMAX 1000

using namespace std;

ifstream cin ("barbar.in");
ofstream cout ("barbar.out");

queue < pair <int, int> > myqueue;
int n, m, linit, cinit, lfinish, cfinish;
int vdist[NMAX + 3][NMAX + 3];
bool fmat[NMAX + 3][NMAX + 3];
char mat[NMAX + 3][NMAX + 3];
int dlin[] = {1, 0,  0, -1};
int dcol[] = {0, 1, -1,  0};

char get_next() {
  char ch;

  ch = cin.get();
  while (!(ch == '*' || ch == 'I' || ch == 'D' || ch == 'O' || ch == '.'))
    ch = cin.get();
  return ch;
}

void bfs() {
  int i, j, lin, col, dir, dist, newlin, newcol;

  for (i = 1; i <= n; i++)
    for (j = 1; j <= m; j++)
      if (mat[i][j] == 'D') {
        myqueue.push(pair<int, int>(i, j));
        vdist[i][j] = 0;
      }

  while (!myqueue.empty()) {
    lin = myqueue.front().first; col = myqueue.front().second; dist = vdist[lin][col];
    for (dir = 0; dir < 4;dir++) {
      newlin = lin + dlin[dir];
      newcol = col + dcol[dir];
      if (mat[newlin][newcol] != '*' && vdist[newlin][newcol] == -1) {
        vdist[newlin][newcol] = dist + 1;
        myqueue.push(pair<int, int>(newlin, newcol));
      }
    }
    myqueue.pop();
  }
}

void dfs(int lin, int col, int dist) {
  int dir, newlin, newcol;
  fmat[lin][col] = 1;

  for (dir = 0; dir < 4; dir++) {
    newlin = lin + dlin[dir];
    newcol = col + dcol[dir];
    if (fmat[newlin][newcol] == 0 && mat[newlin][newcol] != '*' && vdist[newlin][newcol] >= dist)
      dfs(newlin, newcol, dist);
  }
}

int test(int min_dist) {
  int i, j;

  for (i = 1; i <= n; i++)
    for (j = 1; j <= m; j++)
      fmat[i][j] = 0;

  dfs(linit, cinit, min_dist);
  if (fmat[lfinish][cfinish] == 1)
    return 1;
  return 0;
}

int bs(int st, int dr) {
  int mij, sol;

  sol = -1;
  while (st <= dr) {
    mij = (st + dr) / 2;
    if (test(mij)) {
      st = mij + 1;
      sol = mij;
    }
    else
      dr = mij - 1;
  }

  return sol;
}

void init_mats() {
  int i, j;
  for (i = 1; i <= n; i++)
    for (j = 1; j <= m; j++)
      vdist[i][j] = -1;

  for (i = 0; i <= n + 1; i++)
    mat[i][0] = mat[i][m + 1] = '*';
  for (j = 0; j <= m + 1; j++)
    mat[0][j] = mat[0][n + 1] = '*';
}

int main(){
  int i, j;
  cin >> n >> m;

  for (i = 1; i <= n; i++) {
    for (j = 1; j <= m; j++ ) {
      mat[i][j] = get_next();
      if (mat[i][j] == 'I')
        linit = i, cinit = j;
      else if (mat[i][j] == 'O')
        lfinish = i, cfinish = j;
    }
  }

  init_mats();
  bfs();

  cout << bs(0, vdist[linit][cinit]);
  return 0;
}