Cod sursa(job #2810289)

Utilizator UnknownPercentageBuca Mihnea-Vicentiu UnknownPercentage Data 28 noiembrie 2021 22:48:20
Problema Rj Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <fstream>
#include <deque>
using namespace std;
ifstream f("rj.in");
ofstream g("rj.out");
int l[] = {0, 1, 0, -1, -1, 1, -1, 1}, c[] = {1, 0, -1, 0, -1, 1,  1, -1};
int R[101][101], J[101][101];
int n, m, x1, y1, x2, y2, mn = 2147483647, xf, yf;
deque <pair <int, int>> q;
void citire()
{
    f >> n >> m, f.get();
    int i, j;
    char sir[106];
    for(i = 1;i <= n;i++)
    {
        f.getline(sir, sizeof(sir));
        for(j = 1;j <= m;j++)
        {
            if(sir[j - 1] == 'R') x1 = i, y1 = j;
            if(sir[j - 1] == 'J') x2 = i, y2 = j;
            if(sir[j - 1] == 'X') R[i][j] = J[i][j] = -1;
        }
    }
}
bool ok(int i, int j)
{
    if(i < 1 || i > n || j < 1 || j > m) return 0;
    return 1;
}
void lee(int x, int y, int a[101][101])
{
    q.push_back({x, y});
    a[x][y] = 1;
    while(!q.empty())
    {
        int i = q.front().first, j = q.front().second;
        q.pop_front();
        for(int d = 0;d < 8;d++)
        {
            int ii = i + l[d], jj = j + c[d];
            if(ok(ii, jj) && !a[ii][jj])
            {
                a[ii][jj] = a[i][j] + 1;
                q.push_back({ii, jj});
            }
        }
    }
}
void rezolvare()
{
    lee(x1, y1, R), lee(x2, y2, J);
    int i, j;
    for(i = 1;i <= n;i++)
        for(j = 1;j <= m;j++)
        {
            if(R[i][j] > 0 && J[i][j] > 0 && R[i][j] == J[i][j])
            {
                if(R[i][j] < mn) {mn = R[i][j];xf = i, yf = j;}
            }
        }
    g << mn << " " << xf << " " << yf;
}
int main()
{
    citire();
    rezolvare();
}