Cod sursa(job #2661389)

Utilizator stanciucalinStanciu Calin stanciucalin Data 21 octombrie 2020 22:09:40
Problema Rj Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.81 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <string>
using namespace std;

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

int move_line[8] = {-1, -1, -1, 0, 1, 1, 1, 0};
int move_col[8] = {-1, 0, 1, 1, 1, 0, -1, -1};

int start_x[2], start_y[2];

int a[105][105][2], visited[105][105][2];
queue<pair<int, int>> q[2];

int n, m;

bool valid(int i, int j, int q_val){

    if(0 <= i && i < n && 0 <= j && j < m && visited[i][j][q_val] == 0)
        return 1;

    return 0;
}

int repl(char c, int i, int j){

    if(c == ' '){

        return 0;
    }
    else if(c == 'X'){

        visited[i][j][0] = -1;
        visited[i][j][1] = -1;
        return 1;
    }
    else if(c == 'R'){

        visited[i][j][0] = 1;

        start_x[0] = i;
        start_y[0] = j;
        return 2;
    }
    else if(c == 'J'){

        visited[i][j][1] = 1;

        start_x[1] = i;
        start_y[1] = j;
        return 3;
    }
}

void lee(int q_val){

    while (q[q_val].size() > 0){

        for(int u = 0; u < 8; u++){

            if (valid(q[q_val].front().first + move_line[u], q[q_val].front().second + move_col[u], q_val)){

                q[q_val].push(make_pair(q[q_val].front().first + move_line[u], q[q_val].front().second + move_col[u]));

                visited[q[q_val].front().first + move_line[u]][q[q_val].front().second + move_col[u]][q_val] = 1;
                a[q[q_val].front().first + move_line[u]][q[q_val].front().second + move_col[u]][q_val] += a[q[q_val].front().first][q[q_val].front().second][q_val] + 1;
            }
        }

        q[q_val].pop();
    }
}

int main(){

    f >> n >> m;

    char c;
    string line;

    int i, j;
    i = -1;
    j = 0;
    while(getline(f, line, '\n')){

        j = 0;

        for(int k = 0; k < line.size(); k++){

            c = line[k];

            if(c == 'X'){

                visited[i][j][0] = -1;
                visited[i][j][1] = -1;
            }
            else if(c == 'R'){

                visited[i][j][0] = 1;

                start_x[0] = i;
                start_y[0] = j;
            }
            else if(c == 'J'){

                visited[i][j][1] = 1;

                start_x[1] = i;
                start_y[1] = j;
            }

            j += 1;
        }

        i += 1;
    }

    q[0].push(make_pair(start_x[0], start_y[0]));
    q[1].push(make_pair(start_x[1], start_y[1]));

    lee(0);
    lee(1);

    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){

            if(visited[i][j][0] == 1 && visited[i][j][1] == 1 && a[i][j][0] == a[i][j][1]){

                g << a[i][j][0] + 1 << " " << i + 1 << " " << j + 1;

                return 0;
            }
        }
    }
    return 0;
}