Submission #1351959

#TimeUsernameProblemLanguageResultExecution timeMemory
1351959jakovgAwesome Arrowland Adventure (eJOI19_adventure)C++20
100 / 100
31 ms5076 KiB
#include <bits/stdc++.h>

using namespace std;

int main() {
    int n, m;
    cin >> n >> m;

    vector<string> grid(n);
    for (int i = 0; i < n; i++) cin >> grid[i];

    int dr[] = {-1, 0, 1, 0};
    int dc[] = {0, 1, 0, -1};

    vector<vector<int>> dist(n, vector<int>(m, INT_MAX));
    priority_queue<tuple<int,int,int>, vector<tuple<int,int,int>>, greater<>> pq;

    dist[0][0] = 0;
    pq.push({0, 0, 0});

    while (!pq.empty()) {
        auto [d, r, c] = pq.top(); pq.pop();

        if (d > dist[r][c]) continue;
        if (r == n-1 && c == m-1) break;

        if (grid[r][c] == 'X') continue;

        int curDir;
        if (grid[r][c] == 'N') curDir = 0;
        else if (grid[r][c] == 'E') curDir = 1;
        else if (grid[r][c] == 'S') curDir = 2;
        else curDir = 3;

        for (int dir = 0; dir < 4; dir++) {
            int nr = r + dr[dir];
            int nc = c + dc[dir];
            if (nr < 0 || nr >= n || nc < 0 || nc >= m) continue;

            int w = (dir - curDir + 4) % 4;
            if (dist[r][c] + w < dist[nr][nc]) {
                dist[nr][nc] = dist[r][c] + w;
                pq.push({dist[nr][nc], nr, nc});
            }
        }
    }

    if (dist[n-1][m-1] == INT_MAX)
        cout << -1 << "\n";
    else
        cout << dist[n-1][m-1] << "\n";

    return 0;
}
#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...