Cod sursa(job #3157185)

Utilizator SSKMFSS KMF SSKMF Data 14 octombrie 2023 16:19:40
Problema Rj Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.44 kb
#include <fstream>
#include <queue>
using namespace std;

ifstream cin ("rj.in");
ofstream cout ("rj.out");

const short directie[2][8] = {{-1 , -1 , -1 , 0 , 0 , 1 , 1 , 1} , {-1 , 0 , 1 , -1 , 1 , -1 , 0 , 1}};
int durata[2][101][101];

void Lee (pair <int , int> inceput , int linii , int coloane , int matrice[][101])
{
    auto Inside = [&] (const int linie , const int coloana) -> bool 
        { return 1 <= linie && linie <= linii && 1 <= coloana && coloana <= coloane; };

    queue < pair <int , int> > coordonate; coordonate.push(inceput);
    while (!coordonate.empty())
    {
        const int linie_1 = coordonate.front().first , coloana_1 = coordonate.front().second;
        for (int indice = 0 ; indice < 8 ; indice++)
        {
            const int linie_2 = linie_1 + directie[0][indice] , coloana_2 = coloana_1 + directie[1][indice];
            if (Inside(linie_2 , coloana_2) && !matrice[linie_2][coloana_2])
                { matrice[linie_2][coloana_2] = matrice[linie_1][coloana_1] + 1; coordonate.push(make_pair(linie_2 , coloana_2)); }
        }

        coordonate.pop();
    }
}

int main ()
{
    int linii , coloane;
    cin >> linii >> coloane;

    char sir[101];
    cin.getline(NULL , 0);
    pair <int , int> inceput[2];
    for (int linie = 1 ; linie <= linii ; linie++)
    {
        cin.getline(sir , coloane + 1);
        for (int coloana = 1 ; coloana <= coloane ; coloana++)
            switch (sir[coloana - 1])
            {
                case 'X': durata[0][linie][coloana] = durata[1][linie][coloana] = -1; break;
                case 'R': { inceput[0] = make_pair(linie , coloana); durata[0][linie][coloana] = 1; } break;
                case 'J': { inceput[1] = make_pair(linie , coloana); durata[1][linie][coloana] = 1; } break;
            }
    }

    Lee(inceput[0] , linii , coloane , durata[0]);
    Lee(inceput[1] , linii , coloane , durata[1]);

    int minim = 2e9;
    pair <int , int> coordonate;
    for (int linie = 1 ; linie <= linii ; linie++)
        for (int coloana = 1 ; coloana <= coloane ; coloana++)
            if (durata[0][linie][coloana] == durata[1][linie][coloana] && 0 < durata[0][linie][coloana] && durata[0][linie][coloana] < minim)
                { minim = durata[0][linie][coloana]; coordonate = make_pair(linie , coloana); }

    cout << minim << ' ' << coordonate.first << ' ' << coordonate.second;
    cout.close(); cin.close();
    return 0;
}