Submission #439934

#TimeUsernameProblemLanguageResultExecution timeMemory
439934elazarkorenAwesome Arrowland Adventure (eJOI19_adventure)C++17
100 / 100
151 ms21192 KiB
#include <iostream> #include <vector> #include <algorithm> #include <queue> #define chkmin(a, b) a = min(a, b) #define x first #define y second using namespace std; typedef vector<int> vi; typedef vector<vi> vvi; typedef pair<int, int> pii; typedef vector<pii> vii; typedef vector<bool> vb; typedef vector<vb> vvb; const int infinity = 1e9; //int ans = infinity; int dir_x[] = {-1, 0, 1, 0}; int dir_y[] = {0, 1, 0, -1}; int n, m; //void Dfs(vvi &graph, int x, int y, vvb &visited, int count) { // if (x < 0 || x >= n || y < 0 || y >= m) return; // if (visited[x][y]) return; // if (x == n - 1 && y == m - 1) { // chkmin(ans, count); // return; // } // if (graph[x][y] == 4) return; // visited[x][y] = true; // for (int i = 0; i < 4; i++) { // Dfs(graph, x + dir_x[graph[x][y]], y + dir_y[graph[x][y]], visited, count + i); // graph[x][y]++; // graph[x][y] %= 4; // } // visited[x][y] = false; //} inline int Val(int i, int j) { return i + n * j; } vector<vii> graph; int Dijkstra() { vi distances(n * m, infinity); vb visited(n * m); distances[0] = 0; priority_queue<pii, vii, greater<pii>> pq; pq.push({0, 0}); while (!pq.empty()) { int node = pq.top().y, d = pq.top().x; pq.pop(); if (visited[node]) continue; visited[node] = true; for (pii neighbor : graph[node]) { if (distances[neighbor.x] > neighbor.y + d) { distances[neighbor.x] = neighbor.y + d; pq.push({neighbor.y + d, neighbor.x}); } } } return distances[n * m - 1]; } int main() { cin >> n >> m; graph.resize(n * m); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { char c; cin >> c; int curr = 0; if (c == 'X') { curr = 4; } else if (c == 'S') { curr = 2; } else if (c == 'W') { curr = 3; } else if (c == 'E') { curr = 1; } int node = Val(i, j); if (curr != 4) { for (int k = 0; k < 4; k++) { i += dir_x[k], j += dir_y[k]; if (0 <= i && i < n && 0 <= j && j < m) { graph[node].push_back({Val(i, j), (k - curr + 4) % 4}); } i -= dir_x[k], j -= dir_y[k]; } } } } // vvb visited(n, vb(m)); // Dfs(graph, 0, 0, visited, 0); int ans = Dijkstra(); cout << (ans == infinity ? -1 : ans); 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...