Cod sursa(job #1644428)

Utilizator secretCCMniciun nume secretCCM Data 9 martie 2016 23:10:05
Problema Rj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.35 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <string.h>

using namespace std;
ifstream f("rj.in");
ofstream g("rj.out");

const int Nmax = 105;
int r[Nmax][Nmax], ju[Nmax][Nmax], n, m, rxi, ryi, jxi, jyi, Min = 10000, sx, sy, x[] = {-1,-1,-1,0,1,1,1,0};
int y[] = {-1,0,1,1,1,0,-1,-1};

queue <pair<int, int> > R,J;

void LEER()
{
    int xc,yc,xv,yv;
    R.push(make_pair(rxi,ryi));
    r[rxi][ryi] = 1;
    while(!R.empty())
    {
        xc = R.front().first;
        yc = R.front().second;
        R.pop();
        for(int i = 0; i < 8; i++)
        {
            xv = xc + x[i];
            yv = yc + y[i];
            if(r[xv][yv] == 0)
            {
                r[xv][yv] = r[xc][yc] + 1;
                R.push(make_pair(xv,yv));
            }
        }
    }
}

void LEEJ()
{
    int xc,yc,xv,yv;
    J.push(make_pair(jxi,jyi));
    ju[jxi][jyi] = 1;
    while(!J.empty())
    {
        xc = J.front().first;
        yc = J.front().second;
        J.pop();
        for(int i = 0; i < 8; i++)
        {
            xv = xc + x[i];
            yv = yc + y[i];
            if(ju[xv][yv] == 0)
            {
                ju[xv][yv] = ju[xc][yc] + 1;
                J.push(make_pair(xv,yv));
            }
        }
    }
}

int main()
{
    f>>n>>m;
    f.get();
    for(int i = 0; i <= n+1; i++) r[i][0] = r[i][m+1] = ju[i][0] = ju[i][m+1] = -1;
    for(int i = 0; i <= m+1; i++) r[0][i] = r[n+1][i] = ju[0][i] = ju[n+1][i] = -1;
    for(int i = 1; i <= n; i++)
    {
        char x[Nmax];
        f.getline(x,Nmax);
        for(int j = 0; j < m; j++)
        {
            if(x[j] == 'X') r[i][j+1] = ju[i][j+1] = -1;
            if(x[j] == 'R')
            {
                rxi = i;
                ryi = j+1;
            }
            if(x[j] == 'J')
            {
                jxi = i;
                jyi = j+1;
            }
        }
    }
    LEER();
    LEEJ();
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            if(r[i][j] == ju[i][j] && r[i][j] > 0)
            {
                if(Min > r[i][j])
                {
                    Min = r[i][j];
                    sx = i;
                    sy = j;
                }
            }
        }
    }
    g<<Min<<' '<<sx<<' '<<sy<<'\n';
    return 0;
}