Cod sursa(job #1904304)

Utilizator Storm_FireFox1Matei Gardus Storm_FireFox1 Data 5 martie 2017 14:16:09
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.3 kb
#include <fstream>
#include <string>

using namespace std;

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

const short NMAX = 100;
const short nd = 4;
const short dx[nd] = {-1, 1, 0, 0};
const short dy[nd] = {0, 0, -1, 1};

short v[NMAX + 2][NMAX + 2];
short qx[NMAX * NMAX + 1], qy[NMAX * NMAX + 1];

int main()
{
    short n, m;
    fin >> n >> m;
    string s;
    getline(fin, s);
    short startrx, startry, startjx, startjy;
    for ( short i = 1; i <= n; ++ i ) {
        getline(fin, s);
        for ( short j = 0; j < short(s.size()); ++ j ) {
            if ( s[j] == 'X' ) {
                v[i][j+1] = NMAX*NMAX+1;
            }
            if (s[j] == 'R') {
                v[i][j+1] = 1;
                startrx = i;
                startry = j + 1;
            }
            if (s[j] == 'J') {
                v[i][j+1] = -1;
                startjx = i;
                startjy = j + 1;
            }
        }
    }
    for(short i = 0; i <= n + 1; i++)
    {
        v[0][i] = NMAX*NMAX + 1;
        v[n + 1][i] = NMAX*NMAX + 1;
        v[i][0] = NMAX*NMAX + 1;
        v[i][n + 1] = NMAX*NMAX + 1;
    }
    qx[1] = startrx;
    qy[1] = startry;
    qx[2] = startjx;
    qy[2] = startjy;
    short qb = 1, qe = 2, tmin = NMAX + 1, stopx = NMAX, stopy = NMAX;
    while(qb <= qe)
    {
        short x = qx[qb], y = qy[qb];
        for(short i = 0; i < nd; i++)
        {
            short xn = x + dx[i], yn = y + dy[i];
            if(v[xn][yn] == 0) {
                if(v[x][y] < 0){
                    v[xn][yn] = v[x][y] - 1;
                }
                else if(v[x][y] > 0) {
                    v[xn][yn] = v[x][y] + 1;
                }
                ++qe;
                qx[qe] = xn;
                qy[qe] = yn;
            }
            else if(v[xn][yn] != 0) {
                if((v[x][y] > 0 && v[xn][yn] < 0) || (v[x][y] < 0 && v[xn][yn] > 0)) {
                    tmin = v[x][y];
                    if(tmin < 0) {
                        tmin = -tmin;
                    }
                    tmin--;
                    stopx = min(stopx, x);
                    stopy = min(stopy, y);
                }
            }
        }
        qb++;
    }
    fout << tmin << " " << stopx << " " << stopy;
    return 0;
}