Cod sursa(job #2376412)

Utilizator ProBatmanBalint Leonard ProBatman Data 8 martie 2019 15:29:33
Problema Rj Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.61 kb
/*
88 = X
82 = R
74 = J
32 = " "
*/
#include <bits/stdc++.h>

using namespace std;

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

const int CMAX = 110;
char c[CMAX];
int harta[CMAX][CMAX] , N , M , i , j , k , s_i , s_j;

int drum_j[CMAX][CMAX] = {0} , drum_r[CMAX][CMAX] = {0};

int r_i , r_j , rr = 0 , oky , rp_i , rp_j;
// pas 1 - Romeo , pas 2 - Julieta
int dx[] = {-1 , -1 , -1 , 0 , 0 , +1 , +1 , +1};
int dy[] = {-1 , 0 , +1 , -1 , +1 , -1 , 0 , +1};
int minim = INT_MAX;

queue < pair < int , int > > Q; //drumul Romeo
queue < pair < int , int > > Q1; //drumul julieta

void afisare1()
{
    for(i=1;i<=N;i++)
    {
        for(j=1;j<=M;j++)
        {
            if(drum_r[i][j]==-1)
                cout << "X ";
            else
                cout << drum_r[i][j] << " ";

        }
        cout << endl;
    }
}

void afisare2()
{
    for(i=1;i<=N;i++)
    {
        for(j=1;j<=M;j++)
        {
            if(drum_j[i][j]==-1)
                cout << "X ";
            else
                cout << drum_j[i][j] << " ";

        }
        cout << endl;
    }
}
void citire()
{
    fin >> N >> M;
    fin.getline(c,CMAX);
    for(i=1;i<=N;i++)
    {
        fin.getline(c,CMAX);
        for(j=0;j<=M-1;j++)
        {
            harta[i][j+1] = (int)c[j];
            if(harta[i][j+1]==32){
                drum_j[i][j+1] = 0;
                drum_r[i][j+1] = 0;
            }
            else{
                drum_j[i][j+1] = -1;
                drum_r[i][j+1] = -1;
            }
            if(harta[i][j+1]==82)
            {
                drum_r[i][j+1] = 1;
                Q.push(make_pair(i,j+1));
            }
            if(harta[i][j+1]==74)
            {
                drum_j[i][j+1] = 1;
                Q1.push(make_pair(i,j+1));
            }
        }
    }
}

bool OK1(int cord_i , int cord_j)
{
    if(cord_i<=0||cord_j<=0||cord_i>N||cord_j>M||drum_r[cord_i][cord_j]!=0)
        return false;
    return true;
}
bool OK2(int cord_i , int cord_j)
{
    if(cord_i<=0||cord_j<=0||cord_i>N||cord_j>M||drum_j[cord_i][cord_j]!=0)
        return false;
    return true;
}
void lee()
{
    int i_nou , j_nou;
    while(!Q.empty())
    {
        for(k=0;k<=7;k++)
        {
            i_nou = Q.front().first + dx[k];
            j_nou = Q.front().second + dy[k];
            if(OK1(i_nou,j_nou)==true)
            {
                drum_r[i_nou][j_nou] = drum_r[Q.front().first][Q.front().second] + 1;
                Q.push(make_pair(i_nou,j_nou));
            }
        }
        Q.pop();
    }
}

void lee1()
{
    int i_nou , j_nou;
    while(!Q1.empty())
    {
        for(k=0;k<=7;k++)
        {
            i_nou = Q1.front().first + dx[k];
            j_nou = Q1.front().second + dy[k];
            if(OK2(i_nou,j_nou)==true)
            {
                drum_j[i_nou][j_nou] = drum_j[Q1.front().first][Q1.front().second] + 1;
                Q1.push(make_pair(i_nou,j_nou));
            }
        }
        Q1.pop();
    }
}
int main()
{
    citire();
    lee();
    lee1();
    afisare1();
    cout << endl;
    afisare2();
    for(i=1;i<=N;i++)
    {
        for(j=1;j<=M;j++)
        {
            if(drum_r[i][j]!=-1&&drum_r[i][j]==drum_j[i][j]&&drum_r[i][j]!=0)
            {
                if(minim>drum_r[i][j])
                {
                    minim = drum_r[i][j];
                    r_i = i;
                    r_j = j;
                    rr = drum_r[i][j];
                }
            }
        }
    }
    fout << rr << " " << r_i << " " << r_j;
    return 0;
}