Cod sursa(job #1851696)

Utilizator SenibelanMales Sebastian Senibelan Data 19 ianuarie 2017 23:05:53
Problema Rj Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.19 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, Solj;
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;
    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((Sol == v[newX][newY] && newY < Sol) || v[newX][newY] < Sol)
                        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;
}