Cod sursa(job #2470881)

Utilizator koocieSas Vlad-Stefan koocie Data 9 octombrie 2019 20:33:32
Problema Rj Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.39 kb
#include <fstream>
#include <queue>

int main()
{
  std::ifstream in("rj.in");
  std::ofstream out("rj.out");

  const int LCMAX = 105;
  int linii, coloane;
  int romeo[LCMAX][LCMAX], julieta[LCMAX][LCMAX];
  int romI, romJ;
  int julI, julJ;
  char caracterCitit;
  std::queue<std::pair<int, int>> queueR, queueJ;

  in >> linii >> coloane;
  in >> std::noskipws >> caracterCitit;

  for (int i = 0; i <= linii + 1; i++)
  {
    romeo[i][0] = julieta[i][0] = 9;
    romeo[i][coloane + 1] = julieta[i][coloane + 1] = 9;
  }

  for (int j = 0; j <= coloane + 1; j++)
  {
    romeo[0][j] = julieta[0][j] = 9;
    romeo[linii + 1][j] = julieta[linii + 1][j] = 9;
  }

  for (int i = 1; i <= linii; i++)
  {
    for (int j = 1; j <= coloane; j++)
    {
      in >> std::noskipws >> caracterCitit;

      switch (caracterCitit)
      {
      case 'R':
        romeo[i][j] = 1;
        romI = i;
        romJ = j;
        break;
      case 'J':
        julieta[i][j] = 1;
        julI = i;
        julJ = j;
        break;
      case 'X':
        romeo[i][j] = julieta[i][j] = 9;
      default:
        break;
      }
    }

    in >> std::noskipws >> caracterCitit;
  }

  /*
  for (int i = 0; i <= linii + 1; i++)
  {
    for (int j = 0; j <= coloane + 1; j++)
    {
      if (!romeo[i][j])
        out << " ";
      else
        out << romeo[i][j];
    }
    out << '\n';
  }
  */

  int dirI[] = {-1, -1, -1, 0, 1, 1, 1, 0};
  int dirJ[] = {-1, 0, 1, 1, 1, 0, -1, -1};

  queueR.push({romI, romJ});
  queueJ.push({julI, julJ});

  while (!queueR.empty())
  {
    int i = queueR.front().first;
    int j = queueR.front().second;

    for (int dir = 0; dir < 8; dir++)
    {
      int vI = i + dirI[dir];
      int vJ = j + dirJ[dir];

      if (!romeo[vI][vJ])
      {
        romeo[vI][vJ] = romeo[i][j] + 1;
        queueR.push({vI, vJ});
      }
    }

    queueR.pop();
  }

  while (!queueJ.empty())
  {
    int i = queueJ.front().first;
    int j = queueJ.front().second;

    for (int dir = 0; dir < 8; dir++)
    {
      int vI = i + dirI[dir];
      int vJ = j + dirJ[dir];

      if (!julieta[vI][vJ])
      {
        julieta[vI][vJ] = julieta[i][j] + 1;
        queueJ.push({vI, vJ});
      }
    }

    queueJ.pop();
  }

  int minim = romeo[julI][julJ] / 2 + 1;

  out << minim;

  in.close();
  out.close();
}