Cod sursa(job #2893990)

Utilizator LelFunXDCirimpei Luca LelFunXD Data 26 aprilie 2022 23:25:43
Problema Rj Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.77 kb
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("rj.in");
ofstream fout("rj.out");
queue < pair <int, int> > coada;
int dx[] = { 0, 1, 0, -1, -1, 1, 1, -1 };
int dy[] = { 1, 0, -1, 0, 1, 1, -1, -1 };
int mat[110][110];
int a[110][110], b[110][110];
int n, m;
int x, y;
int iR, jR, iJ, jJ;
char c[110][110];
int tmin = 20000;
int pozi, pozj;
bool border(int a, int b)
{
    return a >= 1 && a <= n && b >= 1 && b <= m;
}
void Lee1()
{
    while (!coada.empty())
    {
        x = coada.front().first;
        y = coada.front().second;
        coada.pop();
        for (int i = 0; i <= 7; i++)
        {
            int inou = x + dx[i];
            int jnou = y + dy[i];
            if (border(inou, jnou) && a[inou][jnou] == 0 && mat[inou][jnou] == 0)
            {
                a[inou][jnou] = a[x][y] + 1;
                coada.push(make_pair(inou, jnou));
            }

        }
    }
}
void Lee2()
{
    while (!coada.empty())
    {
        x = coada.front().first;
        y = coada.front().second;
        coada.pop();
        for (int i = 0; i <= 7; i++)
        {
            int inou = x + dx[i];
            int jnou = y + dy[i];
            if (border(inou, jnou) &&  b[inou][jnou] == 0 && mat[inou][jnou] == 0)
            {
                b[inou][jnou] = b[x][y] + 1;
                coada.push(make_pair(inou, jnou));
            }
        }
    }
}
int main()
{
    fin >> n >> m;
    for (int i = 0; i <= n; i++)
      fin.getline(c[i], 101);
    for(int i = 1; i <= n; i++)
        for (int j = 0; j < m; j++)
        {
            if (c[i][j] == 'X')
              mat[i][j + 1] = -1;
            else if (c[i][j] == 'R')
            {
                iR = i;
                jR = j + 1;
                a[i][j + 1] = 1;
            }
            else if (c[i][j] == 'J')
            {
                iJ = i;
                jJ = j + 1;
                b[i][j + 1] = 1;
            }
        }
    coada.push(make_pair(iR, jR));
    Lee1();
    coada.push(make_pair(iJ, jJ));
    Lee2();
    for(int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
        {
            if (a[i][j] == b[i][j] && a[i][j] != 0)
            {
                if (a[i][j] < tmin)
                {
                    tmin = a[i][j];
                    pozi = i;
                    pozj = j;
                }
                else if (a[i][j] == tmin)
                {
                    if (i < pozi)
                        pozi = i;
                    else if (i == pozi)
                    {
                        if (j < pozj)
                            pozj = j;
                    }
                }
            }
        }
    fout << tmin << " " << pozi << " " << pozj;
}