Submission #622887

#TimeUsernameProblemLanguageResultExecution timeMemory
622887fabijan_cikacAwesome Arrowland Adventure (eJOI19_adventure)C++17
100 / 100
96 ms33204 KiB
#include <bits/stdc++.h> using namespace std; #define pp pair<int, int> #define F first #define S second const int N = 510; const int INF = 1e9; int n, m; char a[N][N]; vector<pp> v[N * N]; set<pp> s; int dist[N * N]; int gd[N][N] = { 0 }; int lab(int x, int y){ return (x * m + y); } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> m; for (int i = 0; i < n; ++i){ for (int j = 0; j < m; ++j){ cin >> a[i][j]; if (a[i][j] != 'X' || (i == n - 1 && j == m - 1)) gd[i][j] = 1; } } for (int i = 0; i < n; ++i){ for (int j = 0; j < m; ++j){ if (a[i][j] == 'X') continue; vector<int> d(4); if (a[i][j] == 'N') d = {0, 1, 2, 3}; else if (a[i][j] == 'E') d = {3, 0, 1, 2}; else if (a[i][j] == 'S') d = {2, 3, 0, 1}; else d = {1, 2, 3, 0}; if (j + 1 < m && gd[i][j + 1]) v[lab(i, j)].push_back({d[1], lab(i, j + 1)}); if (j - 1 >= 0 && gd[i][j - 1]) v[lab(i, j)].push_back({d[3], lab(i, j - 1)}); if (i + 1 < n && gd[i + 1][j]) v[lab(i, j)].push_back({d[2], lab(i + 1, j)}); if (i - 1 >= 0 && gd[i - 1][j]) v[lab(i, j)].push_back({d[0], lab(i - 1, j)}); } } for (int i = 0; i < N * N; ++i) dist[i] = INF; dist[0] = 0; s.insert({0, 0}); int bio[N * N] = { 0 }; while (!s.empty()){ auto it = s.begin(); int x = (*it).S; if (bio[x]){ s.erase(it); continue; } dist[x] = (*it).F; if (x == lab(n - 1, m - 1)) break; bio[x] = 1; s.erase(it); for (pp y: v[x]){ if (dist[y.S] > dist[x] + y.F){ dist[y.S] = dist[x] + y.F; s.insert({dist[y.S], y.S}); } } } int val = dist[lab(n - 1, m - 1)]; if (val != INF) cout << val; else cout << -1; 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...