Cod sursa(job #2784926)

Utilizator C_R_I_S_T_I_2_3Cristi Gavrila C_R_I_S_T_I_2_3 Data 17 octombrie 2021 18:23:06
Problema Rj Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.51 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("rj.in");
ofstream fout("rj.out");
int n, m, xR, yR, xJ, yJ, xM, yM, minim=INT_MAX, aux;
int a[105][105], leer[105][105], leej[105][105];
int dx[] = {-1, 1, 0, 0, 1, -1, -1, 1}, dy[] = {0, 0, -1, 1, 1, 1, -1, -1};
char c;

struct coord
{
    int x;
    int y;
};
queue<coord> q;
inline void Citire()
{
    fin >> n >> m;
    for(int i=1; i<=n; i++)
    {
        for(int j=0; j<m+1; j++)
        {
            fin.get(c);
            if(c == 'X')
                a[i][j] = 1;
            else if(c ==' ')
                a[i][j] = 0;
            else if(c == 'R')
                xR=i, yR=j;
            else if(c == 'J')
                xJ=i, yJ=j;
        }
    }
}
inline void Bordare()
{
    for(int i=1; i<=n; i++)
        a[i][0] = a[i][m+1] = 1;
    for(int i=1; i<=m; i++)
        a[0][i] = a[n+1][i] = 1;
}
inline void Afisare()
{
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
        {
            if(leer[i][j] == leej[i][j] && leer[i][j]!=0)
            {
                aux=leer[i][j];
                if(aux<minim)
                {
                    minim = aux;
                    xM = i, yM = j;
                }
            }
        }
    }
    fout  << leer[xM][yM] << " " << xM << " " << yM;
}
inline void LeeR()
{
    int x, y;
    coord w1, w2;
    w1.x=xR;
    w1.y=yR;
    q.push(w1);
    leer[xR][yR]=1;
    while (q.empty()!=1)
    {
        w1=q.front();
        q.pop();
        for(int i=0; i<=7; i++)
        {
            x=w1.x+dx[i];
            y=w1.y+dy[i];
            if(a[x][y]==0 && (leer[x][y]==0 || leer[x][y] > leer[w1.x][w1.y]+1))
            {
                leer[x][y]=leer[w1.x][w1.y]+1;
                w2.x=x;
                w2.y=y;
                q.push(w2);
            }
        }
    }
}
inline void LeeJ()
{
    int x, y;
    coord w1, w2;
    w1.x=xJ;
    w1.y=yJ;
    q.push(w1);
    leej[xJ][yJ]=1;
    while (q.empty()!=1)
    {
        w1=q.front();
        q.pop();
        for(int i=0; i<=7; i++)
        {
            x=w1.x+dx[i];
            y=w1.y+dy[i];
            if(a[x][y]==0 && (leej[x][y]==0 || leej[x][y] > leej[w1.x][w1.y]+1))
            {
                leej[x][y]=leej[w1.x][w1.y]+1;
                w2.x=x;
                w2.y=y;
                q.push(w2);
            }
        }
    }
}
int main()
{
    Citire();
    Bordare();
    LeeR();
    LeeJ();
    Afisare();
    return 0;
}