Pagini recente » Cod sursa (job #2308894) | Cod sursa (job #1524716) | Cod sursa (job #1896268) | Cod sursa (job #865199) | Cod sursa (job #3134557)
#include <fstream>
#include <queue>
using namespace std;
ifstream cin("rj.in");
ofstream cout("rj.out");
int linii, coloane;
int VeciniX[8] = {-1, -1, -1, 0, 1, 1, 1, 0};
int VeciniY[8] = {-1, 0, 1, 1, 1, 0, -1, -1};
struct MatriceLee{
int Distanta = 0;
bool RomeoPassed = false;
bool JulietPassed = false;
};
struct Punct {
int x;
int 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;
}