Cod sursa(job #2340759)

Utilizator crion1999Anitei cristi crion1999 Data 10 februarie 2019 22:02:55
Problema Rj Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.25 kb
#include <iostream>
#include <fstream>
#include <queue>
#define NMAX 105
using namespace std;
ifstream fi("rj.in");
ofstream fo("rj.out");

int N, M;
int hartaR[NMAX][NMAX];
int hartaJ[NMAX][NMAX];

int diri[] = { 1, 0, 0,-1, 1,-1,-1, 1};
int dirj[] = { 0,-1, 1, 0, 1,-1, 1,-1};
int poziR, poziJ, pozjJ, pozjR;
queue<pair<int,int> > q;

string s[NMAX];
int mini, minj, minn = 0x3f3f3f3f;

bool Check(int x, int y) {return (x > 0 && y > 0 && x <= N && y <= M && hartaR[x][y] != -1);}

void Lee(int harta[NMAX][NMAX],int i, int j)
{
    q.push({i,j});
    while(!q.empty())
    {
        int x = q.front().first;
        int y = q.front().second;
        q.pop();
        for(int k = 0; k < 8; ++k)
        {
            int xx = x + diri[k];
            int yy = y + dirj[k];
            if(Check(xx,yy))
            {
                if(harta[xx][yy] > harta[x][y] + 1)
                {
                    harta[xx][yy] = harta[x][y] + 1;
                    q.push({xx,yy});
                }
            }
        }
    }
}

int main()
{
    fi >> N >> M;

    for(int i = 0; i <= N; ++i)
        getline(fi,s[i]);

    for(int i = 1; i <= N; ++i)
    {
        for(int j = 0; j < M; ++j)
        {

            if(s[i][j] == 'R')
            {
                hartaR[i][j+1] = 1;
                poziR = i;
                pozjR = j+1;
                hartaJ[i][j+1] = 0x3f3f3f3f;
            }
            else if(s[i][j] == 'J')
            {
                hartaJ[i][j+1] = 1;
                poziJ = i;
                pozjJ = j+1;
                hartaR[i][j+1] = 0x3f3f3f3f;
            }
            else if(s[i][j] == 'X')
                hartaJ[i][j+1] = hartaR[i][j+1] = -1;
            else
                hartaJ[i][j+1] = hartaR[i][j+1] = 0x3f3f3f3f;
        }
    }

    Lee(hartaR, poziR, pozjR);
    Lee(hartaJ, poziJ, pozjJ);


    for(int i = 1; i <= N; ++i)
    {
        for(int j = 1; j <= M; ++j)
        {
            if(hartaJ[i][j] ==  hartaR[i][j] && hartaR[i][j] != -1 && hartaJ[i][j] < minn)
            {
                minn = hartaJ[i][j];
                mini = i;
                minj = j;
            }
        }
    }
    fo <<minn << " "<< mini << " " << minj;

}