Submission #1181914

#TimeUsernameProblemLanguageResultExecution timeMemory
1181914trufanov.pAwesome Arrowland Adventure (eJOI19_adventure)C++20
100 / 100
47 ms2376 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <random>
#include <set>

using namespace std;

typedef long long ll;

const int INF = 1e9;

#pragma GCC optimize ("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")

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

inline int good(int x, int y, int n, int m) {
    return x >= 0 && x < n && y >= 0 && y < m;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n, m;
    cin >> n >> m;
    vector<vector<int>> f(n, vector<int>(m));
    for (int i = 0; i < n; ++i) {
        string s;
        cin >> s;
        for (int j = 0; j < m; ++j) {
            if (s[j] == 'W') {
                f[i][j] = 0;
            } else if (s[j] == 'N') {
                f[i][j] = 1;
            } else if (s[j] == 'E') {
                f[i][j] = 2;
            } else if (s[j] == 'S') {
                f[i][j] = 3;
            } else {
                f[i][j] = -1;
            }
        }
    }
    vector<vector<int>> d(n, vector<int>(m, INF));
    d[0][0] = 0;
    set<pair<int, pair<int, int>>> s;
    s.insert({ 0, {0, 0} });
    while (!s.empty()) {
        auto [x, y] = s.begin()->second;
        s.erase(s.begin());
        if (f[x][y] == -1) {
            continue;
        }
        for (int c = 0; c < 4; ++c) {
            int nx = x + dx[(f[x][y] + c) % 4], ny = y + dy[(f[x][y] + c) % 4];
            if (good(nx, ny, n, m) && d[nx][ny] > d[x][y] + c) {
                s.erase({ d[nx][ny], {nx, ny} });
                d[nx][ny] = d[x][y] + c;
                s.insert({ d[nx][ny], {nx, ny} });
            }
        }
    }
    cout << (d[n - 1][m - 1] == INF ? -1 : d[n - 1][m - 1]) << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...