Cod sursa(job #1851668)

Utilizator SenibelanMales Sebastian Senibelan Data 19 ianuarie 2017 22:40:40
Problema Rj Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <fstream>
#include <cstring>

#define MAX 105

using namespace std;

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

struct cell
{
	int x, y;
	int autor;
};

int N, M;
int Sol, Soli = 1000, Solj = 1000;
int v[MAX][MAX];
int autori[MAX][MAX];
int indice;
int dx[] = {1, 0, -1, 0, 1, -1, -1, 1};
int dy[] = {0, 1, 0, -1, -1, 1, -1, 1};
cell coada[MAX * MAX];

void Read(){
	char sir[200];
	in >> N >> M;
	in.get();
	for(int i = 1; i <= N; ++i){
		in.getline(sir, 200);
		for(int j = 1; j <= M; ++j){
			if(sir[j - 1] == 'X')
				v[i][j] = -1;
			else if(sir[j - 1] == 'R' || sir[j - 1] == 'J'){
				v[i][j] = 1;
				indice++;
				coada[indice].x = i;
				coada[indice].y = j;
				if(sir[j - 1] == 'R')
					autori[i][j] = 1;
				else 
					autori[i][j] = 0;
			}
		}
	}
}

void Lee(){
	bool done = false;
	int author;
	for(int i = 1; i <= indice; ++i){
		for(int k = 0; k < 8; ++k){
			int newX = coada[i].x + dx[k];
			int newY = coada[i].y + dy[k];
			if(v[newX][newY] != -1 && newX > 0 && newX < N + 1 && newY > 0 && newY < M + 1){
				if(v[newX][newY] == 0 && !done){
					indice++;
					v[newX][newY] = v[coada[i].x][coada[i].y] + 1;
					coada[indice].x = newX;
					coada[indice].y = newY;
					autori[newX][newY] = autori[coada[i].x][coada[i].y];
				}
				else{
					if(v[coada[i].x][coada[i].y] + 1 == v[newX][newY] && autori[coada[i].x][coada[i].y] != autori[newX][newY]){
						if(newY < Soli){
							autori[newX][newY] = autori[coada[i].x][coada[i].y];
							Sol = v[newX][newY];
							Soli = newX;
							Solj = newY;
							done = true;
						}
					}
				}
			}
		}
	}
}

void Print(){
	out << Sol << " " << Soli << " " << Solj << "\n";
}


int main(){
	Read();
	Lee();
	Print();
	return 0;
}