Cod sursa(job #2951516)

Utilizator petru-robuRobu Petru petru-robu Data 6 decembrie 2022 17:49:12
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.82 kb
#include <bits/stdc++.h>
using namespace std;

#define N 1007

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

int di[]={-1, 1, 0, 0}, dj[]={0, 0, -1, 1};
int n, m, mat[N][N], d[N][N], v[N][N];
pair<int, int> paftenie, iesire;
vector<pair<int,int>> dragoni;

void print_mat(int a[][N], int n, int m)
{
  for(int i=1; i<=n; i++)
  {
    for(int j=1; j<=m; j++)
      cout<<a[i][j]<<' ';
    cout<<'\n';
  }

  cout<<"\n\n";
}

void read()
{
  fin>>n>>m;
  for(int i=1; i<=n; i++)
    for(int j=1; j<=m; j++)
    {
      char c;
      fin>>c;

      d[i][j] = -1;

      if(c=='*')
        mat[i][j] = -1;
      else
        mat[i][j] = 0;

      if(c=='I')
      {
        paftenie.first = i;
        paftenie.second = j;
      }

      if(c=='O')
      {
        iesire.first = i;
        iesire.second = j;
      }

      if(c=='D')
      {
        d[i][j] = 0;
        dragoni.push_back(make_pair(i, j));
      }
    }
}

bool ok1(int i, int j)
{
  return (mat[i][j]==0 && d[i][j] == -1 && i<=n && i>=1 && j<=m && j>=1);
}

bool ok2(int i, int j, int X)
{
  return (i>=1 && i<=n && j>=1 && j<=m && mat[i][j] == 0 && d[i][j]>=X && v[i][j]==-1);
}

void dist_to_dragons()
{
  queue<pair<int, int>> Q;
  for(auto &dragon:dragoni)
    Q.push(dragon);

  while(!Q.empty())
  {
    int i_curr = Q.front().first;
    int j_curr = Q.front().second;
    Q.pop();

    for(int i=0; i<4; i++)
    {
      int i_vecin = i_curr + di[i];
      int j_vecin = j_curr + dj[i];

      if(ok1(i_vecin, j_vecin))
      {
        Q.push(make_pair(i_vecin, j_vecin));
        d[i_vecin][j_vecin] = d[i_curr][j_curr] + 1;
      }
    }
  }
}

bool check_path(int X)
{
  queue<pair<int,int>> Q;

  for(int i=0; i<=n; i++)
    for(int j=0; j<=m; j++)
      v[i][j]=-1;

  v[paftenie.first][paftenie.second] = 0;
  Q.push(paftenie);

  while(!Q.empty())
  {
    int i_curr = Q.front().first;
    int j_curr = Q.front().second;
    Q.pop();

    for(int i=0; i<4; i++)
    {
      int i_vecin = i_curr + di[i];
      int j_vecin = j_curr + dj[i];

      if(ok2(i_vecin, j_vecin, X))
      {
        Q.push(make_pair(i_vecin, j_vecin));
        v[i_vecin][j_vecin] = v[i_curr][j_curr] + 1;
      }
    }
  }

  if(v[iesire.first][iesire.second]>-1)
    return true;
  else
    return false;

}




int main()
{
  read();
  print_mat(mat, n, m);
  print_mat(d, n, m);
  dist_to_dragons();
  print_mat(d, n, m);

  int st=1, dr=N, sol=-1;
  while(st<=dr)
  {
    int mij = st + (dr-st)/2;
    if(check_path(mij))
    {
      sol = max(sol, mij);
      st = mij + 1;
    }
    else
      dr = mij - 1;
  }

  if(d[paftenie.first][paftenie.second] < sol)
    sol = d[paftenie.first][paftenie.second];

  cout<<sol;
  fout<<sol;

  return 0;
}