Cod sursa(job #2431887)

Utilizator PatrickCplusplusPatrick Kristian Ondreovici PatrickCplusplus Data 21 iunie 2019 10:49:20
Problema Rj Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("rj.in");
ofstream fout("rj.out");

int n, m, dp[101][101][2], rx, ry, jx, jy, minim = 999999999, xf, yf;
char s[101];
int dx[] = {1, -1, 0, 0, 1, 1, -1, -1};
int dy[] = {0, 0, 1, -1, 1, -1, 1, -1};

void Lee(int x, int y, int p)
{
    queue <pair <int, int> > coada;
    coada.push({x, y});
    dp[x][y][p] = 1;
    while (!coada.empty())
    {
        int i = coada.front().first;
        int j = coada.front().second;
        coada.pop();
        for (int k = 0; k < 8; ++k)
        {
            int ii = i + dx[k];
            int jj = j + dy[k];
            if (ii >= 1 && ii <= n && jj >= 1 && jj <= m && dp[ii][jj][p] == 0)
            {
                dp[ii][jj][p] = dp[i][j][p] + 1;
                coada.push({ii, jj});
            }
        }
    }
}

int main()
{
    fin >> n >> m;
    fin.get();
    for (int i = 1; i <= n; ++i)
    {
        fin.get(s, 100);
        for (int j = 1; j <= m; ++j)
        {
            if (s[j - 1] == 'R')
            {
                rx = i;
                ry = j;
            }
            if (s[j - 1] == 'J')
            {
                jx = i;
                jy = j;
            }
            if (s[j - 1] == 'X')
            {
                dp[i][j][0] = dp[i][j][1] = -1;
            }
        }
        fin.get();
    }
    Lee(rx, ry, 0);
    Lee(jx, jy, 1);
    for (int i = 1; i <= n; ++i)
    {
        for (int j = 1; j <= m; ++j)
        {
            if (dp[i][j][0] <= 0 || dp[i][j][1] <= 0)
            {
                continue;
            }
            if (dp[i][j][0] == dp[i][j][1] && dp[i][j][0] < minim)
            {
                minim = dp[i][j][0];
                xf = i;
                yf = j;
            }
        }
    }
    fout << minim << " " << xf << " " << yf;
    fin.close();
    fout.close();
}