Cod sursa(job #2674845)

Utilizator KillHorizon23Orban Robert KillHorizon23 Data 20 noiembrie 2020 15:39:15
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.82 kb
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int NMAX = 1005;
const int di[] = {1, 0, -1, 0};
const int dj[] = {0, 1, 0, -1};
queue<pair<int, int>> q;
int n, m, dm[NMAX][NMAX], bm[NMAX][NMAX], mx;
char c;
pair<int, int> start, finish;
void LeeD()
{
  while (!q.empty())
  {
    int i = q.front().first,
    j = q.front().second;
    q.pop();
    for (int k = 0; k < 4; ++k)
    {
      int ni = di[k] + i,
      nj = dj[k] + j;
      if (dm[ni][nj] != -1 && (!dm[ni][nj] || dm[ni][nj] > dm[i][j] + 1))
      {
        q.push({ni, nj});
        dm[ni][nj] = dm[i][j] + 1;
      }
    }
  }
  bm[start.first][start.second] = dm[start.first][start.second];
}
void LeeB()
{
  while (!q.empty())
  {
    int i = q.front().first,
    j = q.front().second;
    q.pop();
    for (int k = 0; k < 4; ++k)
    {
      int ni = di[k] + i,
      nj = dj[k] + j;
      mx = min(bm[i][j], dm[ni][nj]);
      if (bm[ni][nj] != -1 && bm[ni][nj] < mx)
      {
        q.push({ni, nj});
        bm[ni][nj] = mx;
      }
    }
  }
}
int main()
{
  ios::sync_with_stdio(false);
  fin.tie(0);
  fin >> n >> m;
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= m; ++j)
    {
      fin >> c;
      if (c == 'D')
        dm[i][j] = 1, q.push({i, j});
      else if (c == '*')
        bm[i][j] = dm[i][j] = -1;
      else if (c == 'I')
        start = {i, j};
      else if (c == 'O')
        finish = {i, j};
    }
	for (int i = 0; i <= n + 1; ++i)
		dm[i][0] = bm[i][0] = dm[i][m + 1] = bm[i][m + 1] = -1;
	for (int i = 0; i <= m + 1; ++i)
		dm[0][i] = bm[0][i] = dm[n + 1][i] = bm[n + 1][i] = -1;
  LeeD();
  q.push({start.first, start.second});
  LeeB();
  fout << bm[finish.first][finish.second] - 1;
  return 0;
}