Cod sursa(job #2671910)

Utilizator dariahazaparuHazaparu Daria dariahazaparu Data 12 noiembrie 2020 20:10:22
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.85 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
const int N_MAX = 10005;

int matrix_pf[N_MAX][N_MAX];
int matrix_dr[N_MAX][N_MAX];
std :: queue <std :: pair <int, int>> dq;
std :: string readline;
int n, m;
int start_pf_x, start_pf_y, stop_pf_x, stop_pf_y;
int line[] = {-1, 1, 0, 0};
int column[] = {0, 0, 1, -1};
int maxim;

// a = matrix_dr
// b = matrix_pf
// dx = dq_dr
// dy = dq_pf
// ls = start_pf_x
// cs = start_pf_y

void create_margin() {
    for (int i = 0; i <= n + 1; ++i) {
        matrix_dr[i][0] = matrix_dr[i][m + 1] = -1;
        matrix_pf[i][0] = matrix_pf[i][m + 1] = -1;
    }
    for (int i = 0; i <= m + 1; ++i) {
        matrix_dr[0][i] = matrix_dr[n + 1][i] = -1;
        matrix_pf[0][i] = matrix_pf[n + 1][i] = -1;
    }
}

void lee_dr() {
    while (!dq.empty()) {
        int st, nd;
        st = dq.front().first;
        nd = dq.front().second;
        dq.pop();

        for (int i = 0; i < 4; ++i) {
            int next_st, next_nd;
            next_st = st + line[i];
            next_nd = nd + column[i];
            if (matrix_dr[next_st][next_nd] == 0 or matrix_dr[next_st][next_nd] > matrix_dr[st][nd] + 1) {
                matrix_dr[next_st][next_nd] = matrix_dr[st][nd] + 1;
                dq.push(std :: make_pair(next_st, next_nd));

            }
        }
    }
}

void lee_pf() {
    while(!dq.empty()) {
        int st, nd;
        st = dq.front().first;
        nd = dq.front().second;
        dq.pop();

        for (int i = 0; i < 4; ++i) {
            int next_st, next_nd;
            next_st = st + line[i];
            next_nd = nd + column[i];
            maxim = std :: min(matrix_dr[next_st][next_nd], matrix_pf[st][nd]);
            if (matrix_pf[next_st][next_nd] != -1 and matrix_pf[next_st][next_nd] < maxim) {
                matrix_pf[next_st][next_nd] = maxim;
                dq.push(std :: make_pair(next_st, next_nd));
            }
        }
    }
}

int main() {

    std :: ifstream fin ("barbar.in");
    std :: ofstream fout ("barbar.out");

    fin >> n >> m;
    for (int i = 1; i <= n; ++i) {
        fin >> readline;
        for (int j = 0; j < m; ++j) {
            if (readline[j] == 'D') {
                matrix_dr[i][j+1] = 1;
                dq.push(std :: make_pair(i, j+1));
            } else if (readline[j] == '*') {
                matrix_dr[i][j + 1] = -1;
                matrix_pf[i][j + 1] = -1;
            } else if (readline[j] == 'I') {
                start_pf_x = i;
                start_pf_y = j + 1;
            } else if (readline[j] == 'O') {
                stop_pf_x = i;
                stop_pf_y = j + 1;
            }

        }
    }

    create_margin();

    lee_dr();

    matrix_pf[start_pf_x][start_pf_y] = matrix_dr[start_pf_x][start_pf_y];
    dq.push(std :: make_pair(start_pf_x, start_pf_y));
    lee_pf();

    fout << matrix_pf[stop_pf_x][stop_pf_y] - 1;
    return 0;
}