Cod sursa(job #2060677)

Utilizator retrogradLucian Bicsi retrograd Data 8 noiembrie 2017 16:43:01
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <bits/stdc++.h>

using namespace std;

const int dx[] = {1, 0, -1, 0};
const int dy[] = {0, 1, 0, -1};

int main() {
    ifstream cin("barbar.in");
    ofstream cout("barbar.out");

    int n, m; cin >> n >> m;

    vector<string> Mat(n);
    vector<vector<int>> Viz(n, vector<int>(m, 0));
    vector<vector<int>> Dist = Viz;

    deque<tuple<int, int, int>> Q;
    
    int si, sj, ei, ej;
    for (int i = 0; i < n; ++i) {
        cin >> Mat[i];
        for (int j = 0; j < m; ++j) {
            if (Mat[i][j] == 'D') {
                Q.emplace_back(0, i, j);
                Viz[i][j] = true;
            }

            if (Mat[i][j] == 'I') si = i, sj = j;
            if (Mat[i][j] == 'O') ei = i, ej = j;
        }
    }

    auto valid = [&](int i, int j) {
        return i >= 0 && i < n && j >= 0 && j < m;
    };

    
    while (!Q.empty()) {
        int d, i, j;
        tie(d, i, j) = Q.front(); Q.pop_front();
        Dist[i][j] = d;

        for (int dd = 0; dd < 4; ++dd) {
            int ni = i + dx[dd];
            int nj = j + dy[dd];

            if (!valid(ni, nj)) continue;
            
            if (!Viz[ni][nj] && Mat[ni][nj] != '*') {
                Q.emplace_back(d + 1, ni, nj);
                Viz[ni][nj] = true;
            }
        }
    }

    cerr << "DONE BFS" << endl;

    int ans = Dist[si][sj];
    Viz[si][sj] = false;
    Q.emplace_back(Dist[si][sj], si, sj);

    while (true) {
        int d, i, j;
        assert(!Q.empty());
        tie(d, i, j) = Q.front(); Q.pop_front();
        ans = min(ans, d);

        if (i == ei && j == ej) break;

        for (int dd = 0; dd < 4; ++dd) {
            int ni = i + dx[dd];
            int nj = j + dy[dd];

            if (!valid(ni, nj)) continue;

            if (Viz[ni][nj] && Mat[ni][nj] != '*') {
                if (Dist[ni][nj] < ans) Q.emplace_back(Dist[ni][nj], ni, nj);
                else Q.emplace_front(Dist[ni][nj], ni, nj);
                Viz[ni][nj] = false;
            }
        }
    }

    cout << ans << endl;
}