Cod sursa(job #2676244)

Utilizator IRadu1529Radu Ionescu IRadu1529 Data 23 noiembrie 2020 20:07:59
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.33 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;
typedef long long ll;

ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int NMAX = 1005; int n, m, dm[NMAX][NMAX], bm[NMAX][NMAX], mx;
char c;
const int dx[] = { 1, 0, -1, 0 }, dy[] = { 0, 1, 0, -1 };

queue<pair<int, int>> q;
pair<int, int> start, finish;

void LeeD();
void LeeB();
void read();


int main() {
    ios::sync_with_stdio(false);
    fin.tie(0);
    read();
    LeeD();///dm[i][j] = dist pana la cel mai apropiat dragon
    q.push({ start.first, start.second });
    LeeB();///d[i][j] = min(d[i][i], d[i+-1][j+-1]);
    fout << bm[finish.first][finish.second] - 1 << "\n";
    return 0;
}

void LeeD() {
    while (!q.empty()){
        int i = q.front().first,
            j = q.front().second;
        q.pop();
        for (int k = 0; k < 4; ++k){
            int ni = dx[k] + i, nj = dy[k] + j;
            if (dm[ni][nj] != -1 && (!dm[ni][nj] || dm[ni][nj] > dm[i][j] + 1)){
                q.push({ ni, nj });
                dm[ni][nj] = dm[i][j] + 1;
            }
        }
    }
    bm[start.first][start.second] = dm[start.first][start.second];
}

void LeeB(){
    while (!q.empty()) {
        int i = q.front().first,
            j = q.front().second;
        q.pop();
        for (int k = 0; k < 4; ++k){
            int ni = dx[k] + i, nj = dy[k] + j;
            mx = min(bm[i][j], dm[ni][nj]);//pe unde e mai aproape, unde sunt sau in spatiul vecin
            if (bm[ni][nj] != -1 && bm[ni][nj] < mx){
                q.push({ ni, nj });
                bm[ni][nj] = mx;
            }
        }
    }
}

void read() {///citesc matricea si stabilesc limitele ei
    fin >> n >> m;
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= m; ++j){
            fin >> c;
            if (c == 'D')
                dm[i][j] = 1, q.push({ i, j });
            else if (c == '*')
                bm[i][j] = dm[i][j] = -1;
            else if (c == 'I')
                start = { i, j };
            else if (c == 'O')
                finish = { i, j };
        }

    for (int i = 0; i <= n + 1; ++i)
        dm[i][0] = bm[i][0] = dm[i][m + 1] = bm[i][m + 1] = -1;
    for (int i = 0; i <= m + 1; ++i)
        dm[0][i] = bm[0][i] = dm[n + 1][i] = bm[n + 1][i] = -1;
}