Cod sursa(job #3134559)

Utilizator catalinmarincatalinmarin catalinmarin Data 29 mai 2023 15:27:32
Problema Rj Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.31 kb
#include <fstream>
#include <queue>
using namespace std;
ifstream cin("rj.in");
ofstream cout("rj.out");
short linii, coloane;
short VeciniX[8] = {-1, -1, -1, 0, 1, 1, 1, 0};
short VeciniY[8] = {-1, 0, 1, 1, 1, 0, -1, -1};
struct MatriceLee{
    short Distanta = 0;
    bool RomeoPassed = false;
    bool JulietPassed = false;
};
struct Punct {
    short x;
    short y;
};
MatriceLee MatLee[101][101];
queue<Punct> q;
bool InMat(Punct P){
    return P.x > 0 && P.x <= linii && P.y > 0 && P.y <= coloane;
}
void Lee(){
    while (!q.empty()){
        Punct frn = q.front();
        if (MatLee[frn.x][frn.y].RomeoPassed == true && MatLee[frn.x][frn.y].JulietPassed == true) {
            cout << MatLee[frn.x][frn.y].Distanta << " " << frn.x << " " << frn.y;
            return;
        }
        for (int i = 0; i < 8; i++){
            Punct Vecin;
            Vecin.x = frn.x + VeciniX[i];
            Vecin.y = frn.y + VeciniY[i];
            if (InMat(Vecin) && (MatLee[Vecin.x][Vecin.y].Distanta >= 0 && (MatLee[Vecin.x][Vecin.y].RomeoPassed == false || MatLee[Vecin.x][Vecin.y].JulietPassed == false))){
                MatLee[Vecin.x][Vecin.y].Distanta = MatLee[frn.x][frn.y].Distanta + 1;
                if (MatLee[frn.x][frn.y].RomeoPassed == true)
                    MatLee[Vecin.x][Vecin.y].RomeoPassed = true;
                if (MatLee[frn.x][frn.y].JulietPassed == true)
                    MatLee[Vecin.x][Vecin.y].JulietPassed = true;
                q.push(Vecin);
            }
        }
        q.pop();
    }
}
int main(){
    char blank;
    cin >> linii >> coloane;
    for (int i = 0; i <= linii; i++){
        string linie;
        getline(cin, linie);
        for (int j = 1; j <= coloane; j++){
            if (linie[j-1] == 'X'){
                MatLee[i][j].Distanta = -1;
            } else if (linie[j-1] == 'R'){
                MatLee[i][j].Distanta = 1;
                MatLee[i][j].RomeoPassed = true;
                Punct Romeo;
                Romeo.x = i;
                Romeo.y = j;
                q.push(Romeo);
            } else if (linie[j-1] == 'J'){
                MatLee[i][j].Distanta = 1;
                MatLee[i][j].JulietPassed = true;
                Punct Juliet;
                Juliet.x = i;
                Juliet.y = j;
                q.push(Juliet);
            }
        }
    }
    Lee();
    return 0;
}