Cod sursa(job #2695570)

Utilizator dianapingu1Diana Vasiliu dianapingu1 Data 13 ianuarie 2021 19:03:38
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.87 kb
#include <fstream>
#include <queue>
#include <string>

using namespace std;

const int NMAX = 1000;
int n, m, dist;
int matrix[NMAX+5][NMAX+5];
bool viz[NMAX+5][NMAX+5];
int dl[4] = {0, 1, 0, -1};
int dc[4] = {1, 0, -1, 0};
string s;

struct Cell {
    int linie, coloana;
};

//-1 dragon, 1-de unde pleaca barbarul,, -2 -perete
queue<Cell> q;
queue<Cell> q2;
int dragoni[NMAX+5][NMAX+5];

bool validCell(Cell a) {
    return a.linie >= 1 && a.linie <= n && a.coloana >= 1 && a.coloana <= m;
}

void bfs() {

    Cell a{}, b{};
    while(!q.empty()) {
        a = q.front();
        q.pop();
        for(int i = 0; i < 4; i++) {
            b.linie = a.linie + dl[i];
            b.coloana = a.coloana + dc[i];
            if(validCell(b) && !dragoni[b.linie][b.coloana]) {
                dragoni[b.linie][b.coloana] = dragoni[a.linie][a.coloana] + 1;
                q.push(b);
            }
        }
    }
}

void bfs2() {

    Cell a{}, b{};
    while(!q2.empty()) {
        a = q2.front();
        q2.pop();
        q.push(a);
    }
    while(!q.empty()) {
        a = q.front();
        q.pop();
        for(int i = 0; i < 4; i++) {
            b.linie = a.linie + dl[i];
            b.coloana = a.coloana + dc[i];
            if(validCell(b) && matrix[b.linie][b.coloana] == 0 && !viz[b.linie][b.coloana]) {
                if(dragoni[b.linie][b.coloana] > dist) {
                    viz[b.linie][b.coloana] = true;
                    q.push(b);
                }
                else {
                    q2.push(a);
                }
            }
        }
    }
}
int main() {

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

    Cell a{}, start{}, final{};

    fin >> n >> m;
    fin.get();
    for(int i = 1; i <= n; i++) {
        getline(fin, s);
        for (int j = 0; j < (int) s.size(); j++) {
            if (s[j] == '*') {
                matrix[i][j + 1] = -2;
                dragoni[i][j + 1] = -2;
            }
            else if (s[j] == 'D') {
                matrix[i][j + 1] = -1;
                dragoni[i][j + 1] = 1;
                a.linie = i;
                a.coloana = j + 1;
                q.push(a);
            }
            else if (s[j] == 'I') {
                start.linie = i;
                start.coloana = j + 1;
                viz[start.linie][start.coloana] = true;
            }
            else if (s[j] == 'O') {
                final.linie = i;
                final.coloana = j + 1;
            }
        }
    }

    bfs();

    q2.push(start);
    dist = dragoni[start.linie][start.coloana] - 1;

    while(dist > 0) {
        bfs2();
        if(viz[final.linie][final.coloana]) {
            fout << dist;
            return 0;
        }
        dist--;
    }

    fout<< "-1";

    fin.close();
    fout.close();
    return 0;
}