Cod sursa(job #2926975)

Utilizator juniorOvidiu Rosca junior Data 19 octombrie 2022 08:11:03
Problema Rj Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.14 kb
#include <fstream>
#include <iostream>
#include <iomanip>

#define NMax 102
#define ND 8

using namespace std;

struct Punct {
  int l, c;
} C[NMax*NMax], p;

int nl, nc, lr, cr, lj, cj;
int dl[ND] = {0, 1,  0, -1, -1, 1, -1,  1};
int dc[ND] = {1, 0, -1,  0, -1, 1,  1, -1};
char m[NMax][NMax];
int r[NMax][NMax], j[NMax][NMax];

ifstream fi("rj.in");
ofstream fo("rj.out");

void citeste() {
  int l, c;
  char car;

  fi >> nl >> nc;
  for (l = 0; l <= nl + 1; l++) // bordare
    m[l][0] = m[l][nc+1] = 'X';
  for (l = 0; l <= nc + 1; l++) // bordare
    m[0][l] = m[nl+1][l] = 'X';
  fi.get(car); // trecere la rand nou
  for (l = 1; l <= nl; l++) {
    for (c = 1; c <= nc; c++) {
      fi.get(car); m[l][c] = car;
      if (m[l][c] == 'R') {
        lr = l; cr = c;
      }
      if (m[l][c] == 'J') {
        lj = l; cj = c;
      }
    }
    fi.get(car); // trecere la rand nou
  }
  fi.close();
}

void parcurge (int x0, int y0, int d[NMax][NMax]) {
  int inc = 0, sf = 0, l, c, ln, cn, i;

  for (l = 0; l <= nl + 1; l++)
    for (c = 0; c <= nc + 1; c++)
      d[l][c] = -1;
  C[0].l = x0; C[0].c = y0; d[x0][y0] = 1;
  while (inc <= sf) {
    p = C[inc++];
    for (i = 0; i < ND; i++) {
      ln = p.l + dl[i]; cn = p.c + dc[i];
      if (1 <= ln and ln <= nl and 1 <= cn and cn <= nc) // in oras
        if (m[ln][cn] == ' ' and d[ln][cn] == -1) {
          d[ln][cn] = 1 + d[p.l][p.c];
          sf++; C[sf].l = ln; C[sf].c = cn;
      }
    }
  }
}

void afiseaza() {
  int tmin = NMax * NMax + 5, xmin, ymin, l, c;

  for (l = 1; l <= nl; l++)
    for (c = 1; c <= nc; c++)
      if (r[l][c] == j[l][c])
        if (r[l][c] < tmin && r[l][c] != -1) {
          tmin = r[l][c]; xmin = l; ymin = c;
        }
  fo << tmin << ' ' << xmin << ' ' << ymin;
  fo.close();
}

void d_mat (int m[NMax][NMax]) {
  int l, c;

  for (l = 1; l <= nl; l++) {
    for (c = 1; c <= nc; c++)
      cout << setw (2) << m[l][c] << ' ';
    cout << '\n';
  }
  cout << '\n';
}

int main() {
  citeste();
  parcurge(lr, cr, r); d_mat(r);
  parcurge(lj, cj, j); d_mat(j);
  afiseaza();
  return 0;
}