Cod sursa(job #2426745)

Utilizator Iulia25Hosu Iulia Iulia25 Data 29 mai 2019 10:16:39
Problema Barbar Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.61 kb
#include <fstream>
#include <queue>

using namespace std;

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

int n, m, nr, l, c, dist[1005][1005], L, C, LF, CF;
char a[1005][1005];
bool viz[1005][1005];
queue <int> ql, qc, qnr;

void reinit()  {
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= m; ++j)
      viz[i][j] = 0;
}

bool bfs(int k)  {
  ql.push(L);
  qc.push(C);
  viz[L][C] = true;
  while (!ql.empty())  {
    l = ql.front(); ql.pop();
    c = qc.front(); qc.pop();
    if (c == 0 || l == 0 || c == m || l == n)
      continue;
    if ((a[l + 1][c] == '.' || a[l + 1][c] == 'O') && !viz[l + 1][c] && dist[l + 1][c] >= k)  {
      ql.push(l + 1);
      qc.push(c);
      viz[l + 1][c] = true;
    }
    if ((a[l][c + 1] == '.' || a[l][c + 1] == 'O') && !viz[l][c + 1] && dist[l][c + 1] >= k)  {
      ql.push(l);
      qc.push(c + 1);
      viz[l][c + 1] = true;
    }
    if ((a[l - 1][c] == '.' || a[l - 1][c] == 'O') && !viz[l - 1][c] && dist[l - 1][c] >= k)  {
      ql.push(l - 1);
      qc.push(c);
      viz[l - 1][c] = true;
    }
    if ((a[l][c - 1] == '.' || a[l][c - 1] == 'O') && !viz[l][c - 1] && dist[l][c - 1] >= k)  {
      ql.push(l);
      qc.push(c - 1);
      viz[l][c - 1] = true;
    }
  }
  bool ok = viz[LF][CF];
  reinit();
  return ok;
}

int main()  {
  fin >> n >> m;
  for (int i = 1; i <= n; ++i)  {
    for (int j = 1; j <= m; ++j)  {
      fin >> a[i][j];
      if (a[i][j] == 'D')  {
        ql.push(i);
        qc.push(j);
        qnr.push(0);
      }
      if (a[i][j] == 'I')  {
        L = i, C = j;
      }
      if (a[i][j] == 'O')
        LF = i, CF = j;
    }
  }
  while (!ql.empty())  {
    l = ql.front(); ql.pop();
    c = qc.front(); qc.pop();
    nr = qnr.front(); qnr.pop();
    if (l == 0 || c == 0 || l == n || c == m)
      continue;
    if (dist[l + 1][c] > nr + 1 || dist[l + 1][c] == 0)  {
      ql.push(l + 1);
      qc.push(c);
      qnr.push(nr + 1);
      dist[l + 1][c] = nr + 1;
    }
    if (dist[l - 1][c] > nr + 1 || dist[l - 1][c] == 0)  {
      ql.push(l - 1);
      qc.push(c);
      qnr.push(nr + 1);
      dist[l - 1][c] = nr + 1;
    }
    if (dist[l][c + 1] > nr + 1 || dist[l][c + 1] == 0)  {
      ql.push(l);
      qc.push(c + 1);
      qnr.push(nr + 1);
      dist[l][c + 1] = nr + 1;
    }
    if (dist[l][c - 1] > nr + 1 || dist[l][c - 1] == 0)  {
      ql.push(l);
      qc.push(c - 1);
      qnr.push(nr + 1);
      dist[l][c - 1] = nr + 1;
    }
  }
  int st = 0, dr = dist[LF][CF], mij, ans = -1;
  while (st <= dr)  {
    mij = (st + dr) / 2;
    if (bfs(mij))  {
      ans = mij;
      st = mij + 1;
    }
    else dr = mij - 1;
  }
  fout << ans;
  return 0;
}