Submission #244269

#TimeUsernameProblemLanguageResultExecution timeMemory
244269Matteo_VerzAwesome Arrowland Adventure (eJOI19_adventure)C++11
100 / 100
124 ms21492 KiB
/*
                `-/oo+/-   ``
              .oyhhhhhhyo.`od
             +hhhhyyoooos. h/
            +hhyso++oosy- /s
           .yoooossyyo:``-y`
            ..----.` ``.-/+:.`
                   `````..-::/.
                  `..```.-::///`
                 `-.....--::::/:
                `.......--::////:
               `...`....---:::://:
             `......``..--:::::///:`
            `---.......--:::::////+/`
            ----------::::::/::///++:
            ----:---:::::///////////:`
            .----::::::////////////:-`
            `----::::::::::/::::::::-
             `.-----:::::::::::::::-
               ...----:::::::::/:-`
                 `.---::/+osss+:`
                   ``.:://///-.
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <map>
#include <cmath>

using namespace std;

const int INF = 2e9;
const int N = 500;

int n, m;

vector <pair <int, int>> g[5 + N * N];
bool viz[5 + N * N];
int dp[5 + N * N];

priority_queue <pair <int, int>, vector <pair <int, int>>, greater <pair <int, int>>> heap;

void Dijkstra(int nodStart) {
    for(int i = 1; i <= n * m; i++) dp[i] = INF;
    for(int i = 1; i <= n * m; i++) viz[i] = false;

    dp[nodStart] = 0;
    heap.push(make_pair(0, nodStart));

    while(heap.size()) {
        pair <int, int> top = heap.top();
        heap.pop();

        if(viz[top.second] == false) {
            viz[top.second] = true;

            for(auto to : g[top.second]) {
                if(dp[to.second] > to.first + dp[top.second]) {
                    dp[to.second] = to.first + dp[top.second];
                    heap.push(make_pair(dp[to.second], to.second));
                }
            }
        }
    }
}

int main() {
#ifdef BLAT
    freopen("input.in", "r", stdin);
    freopen("output.out", "w", stdout);
#endif // BLAT

    cin >> n >> m;

    for(int i = 1; i <= n; i++) {
        string s;
        cin >> s;

        for(int j = 0; j < s.size(); j++) {
            int idx = (i - 1) * m + j + 1;
            int idxn, idxe, idxs, idxw;
            idxn = idx - m;
            idxs = idx + m;
            idxe = idx + 1;
            idxw = idx - 1;

            if(s[j] == 'N') {
                if(i > 1) g[idx].push_back(make_pair(0, idxn));
                if(j < m - 1) g[idx].push_back(make_pair(1, idxe));
                if(i < n) g[idx].push_back(make_pair(2, idxs));
                if(j > 0) g[idx].push_back(make_pair(3, idxw));
            } else if(s[j] == 'E') {
                if(i > 1) g[idx].push_back(make_pair(3, idxn));
                if(j < m - 1) g[idx].push_back(make_pair(0, idxe));
                if(i < n) g[idx].push_back(make_pair(1, idxs));
                if(j > 0) g[idx].push_back(make_pair(2, idxw));
            } else if(s[j] == 'S') {
                if(i > 1) g[idx].push_back(make_pair(2, idxn));
                if(j < m - 1) g[idx].push_back(make_pair(3, idxe));
                if(i < n) g[idx].push_back(make_pair(0, idxs));
                if(j > 0) g[idx].push_back(make_pair(1, idxw));
            } else if(s[j] == 'W') {
                if(i > 1) g[idx].push_back(make_pair(1, idxn));
                if(j < m - 1) g[idx].push_back(make_pair(2, idxe));
                if(i < n) g[idx].push_back(make_pair(3, idxs));
                if(j > 0) g[idx].push_back(make_pair(0, idxw));
            }
        }
    }

    Dijkstra(1);

    if(dp[n * m] == INF) cout << -1 << '\n';
    else cout << dp[n * m] << '\n';
    return 0;
}

Compilation message (stderr)

adventure.cpp: In function 'int main()':
adventure.cpp:85:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int j = 0; j < s.size(); j++) {
                        ~~^~~~~~~~~~
#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...