Cod sursa(job #2546877)

Utilizator alextmAlexandru Toma alextm Data 14 februarie 2020 18:02:56
Problema Rj Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.59 kb
#include <fstream>
using namespace std;

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

struct wow
{
    int col, lin;
};

char c;
int n, m, i, j, x, y, a[101][101], b[101][101];
wow coada[10002], R, J;

int dx[]={-1,-1,0,1,1,1,0,-1};
int dy[]={0,1,1,1,0,-1,-1,-1};

void bordare()
{
    for(j = 0; j <= m+1; j++)
    {
        a[0][j] = a[n+1][j] = b[0][j] = b[n+1][j] = -1;
    }

    for(i = 1; i <= n; i++)
        a[i][0] = a[i][m+1] = b[i][0] = b[i][m+1] = -1;
}

int main()
{
    fin >> n >> m;

    fin.get(c);
    for(i = 1; i <= n; i++)
    {
        for(j = 1; j <= m; j++)
        {
            fin.get(c);
            if(c == ' ')
            {
                a[i][j] = 0;
                b[i][j] = 0;
            }
            else if(c == 'R')
            {
                a[i][j] = 1;
                R.lin = i;
                R.col = j;
            }
            else if(c == 'J')
            {
                b[i][j] = 1;
                J.lin = i;
                J.col = j;
            }
            else if(c == 'X')
            {
                a[i][j] = -1;
                b[i][j] = -1;
            }
        }

        fin.get(c);
    }

    bordare();

    coada[1].lin = R.lin;
    coada[1].col = R.col;

    int st = 1, sf = 1;

    while(st <= sf)
    {
        i = coada[st].lin;
        j = coada[st].col;

        for(int k = 0; k < 8; k++)
        {
            x = i + dx[k];
            y = j + dy[k];

            if(a[x][y] == 0)
            {
                sf++;
                coada[sf].lin = x;
                coada[sf].col = y;

                a[x][y] = a[i][j] + 1;
            }
        }

        st++;
    }

    st = 1, sf = 1;

    coada[1].lin = J.lin;
    coada[1].col = J.col;
    while(st <= sf)
    {
        i = coada[st].lin;
        j = coada[st].col;

        for(int k = 0; k < 8; k++)
        {
            x = i + dx[k];
            y = j + dy[k];

            if(b[x][y] == 0)
            {
                sf++;

                coada[sf].lin = x;
                coada[sf].col = y;

                b[x][y] = b[i][j] + 1;
            }
        }

        st++;
    }

    int minim = 10002, xf, yf;
    for(i = 1; i <= n; i++)
    {
        for(j = 1; j <= m; j++)
        {
            if(a[i][j] == b[i][j] && a[i][j] < minim && a[i][j] > 0)
            {
                minim = a[i][j];
                xf = i;
                yf = j;
            }
        }
    }

    fout << minim << " " << xf << " " << yf;

    return 0;
}