Cod sursa(job #3262797)

Utilizator Maan002Barbu Andrei Maan002 Data 11 decembrie 2024 16:52:06
Problema Barbar Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <bits/stdc++.h>
using namespace std;
#define cin fin
#define cout fout
int n, m, mt[251][251], mp[251][251];
char mc[251][251];

queue<pair<int, int>> Q;
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};
ifstream cin("barbar.in");
ofstream cout("barbar.out");

void Lee_DistMin() {
    while (!Q.empty()) {
        int i = Q.front().first;
        int j = Q.front().second;
        Q.pop();
        for (int k = 0; k < 4; k++) {
            int iv = i + dx[k];
            int jv = j + dy[k];
            if (iv >= 1 && iv <= n && jv >= 1 && jv <= m && mt[iv][jv] != -1 && mt[iv][jv] != 0 && mt[iv][jv] > mt[i][j] + 1) {
                mt[iv][jv] = mt[i][j] + 1;
                Q.push(make_pair(iv, jv));
            }
        }
    }
}
void Lee () {
    while (!Q.empty()) {
        int i = Q.front().first;
        int j = Q.front().second;
        Q.pop();
        for (int k = 0; k < 4; ++k) {
            int iv = i + dx[k];
            int jv = j + dy[k];
            if (iv >= 1 && iv <= n && jv >= 1 && jv <= m && mt[iv][jv] != -1 && mt[iv][jv] != 0 &&  mp[iv][jv] < min(mp[i][j], mt[iv][jv])) {
                Q.push(make_pair(iv,jv));
                mp[iv][jv] = min(mp[i][j], mt[iv][jv]);
            }
        }
    }
}
int main() {
    cin >> n >> m;
    int x, y, a, b;
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            cin >> mc[i][j];
            if (mc[i][j] == '.') {
                mt[i][j] = 2e9;
            } else if (mc[i][j] == '*') {
                mt[i][j] = -1;
            } else if (mc[i][j] == 'D') {
                mt[i][j] = 0;
                Q.push(make_pair(i, j));
            } else if (mc[i][j] == 'O') {
                x = i;
                y = j;
                mt[i][j] = 2e9;
            } else if (mc[i][j] == 'I') {
                mt[i][j] = 2e9;
                a = i;
                b = j;
            }
        }
    }
    Lee_DistMin();
    Q.push({a, b});
    mp[a][b] = mt[a][b];
    Lee();
    cout << mp[x][y];
    return 0;
}