Submission #736922

#TimeUsernameProblemLanguageResultExecution timeMemory
736922ksu2009enAwesome Arrowland Adventure (eJOI19_adventure)C++14
100 / 100
46 ms5720 KiB
#include <iostream> #include <vector> #include <string> #include <math.h> #include <cmath> #include <iomanip> #include <cstdio> #include <algorithm> #include <numeric> #include <map> #include <set> #include <queue> #include <stack> #include <deque> #include <bitset> #include <cstring> #include <unordered_map> using namespace std; typedef int ll; ll dp[507][507], used[507][507]; string a[507]; char rotate(char c){ if(c == 'N') return 'E'; if(c == 'E') return 'S'; if(c == 'S') return 'W'; return 'N'; } pair<ll, ll> move(ll &r, ll &c, char &v){ if(v == 'N') return {r - 1, c}; if(v == 'E') return {r, c + 1}; if(v == 'S') return {r + 1, c}; return {r, c - 1}; } ll n, m; void count_dp(ll &r, ll &c, ll step){ if(r < 1 || c < 1 || r > n || c > m || dp[r][c] <= step){ return; } if(a[r][c] == 'X'){ if(r == n && c == m) dp[r][c] = step; return; } dp[r][c] = step; char v = a[r][c]; for(int i = 0; i < 4; i++){ auto y = move(r, c, v); if(y.first >= 1 && y.second >= 1 && y.first <= n && y.second <= m && dp[y.first][y.second] > step + i) count_dp(y.first, y.second, step + i); v = rotate(v); } } ll cost(char a, char b){ for(int i = 0; i < 4; i++){ if(a == b) return i; a = rotate(a); } return 0; } struct one{ ll r, c, cost; }; bool operator < (const one &p1, const one &p2){ return p1.cost < p2.cost; } bool operator > (const one &p1, const one &p2){ return p1.cost > p2.cost; } int main(){ cin >> n >> m; for(int i = 1; i <= n; i++){ cin >> a[i]; a[i] = "#" + a[i]; } priority_queue<one, vector<one>, greater<one>> q; for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) dp[i][j] = 1e9; dp[1][1] = 0; q.push({1, 1, 0}); while(!q.empty()){ auto v = q.top(); q.pop(); if(v.r == n && v.c == m){ break; } if(used[v.r][v.c]) continue; used[v.r][v.c] = 1; if(a[v.r][v.c] == 'X') continue; ll r = v.r, c = v.c; if(r - 1 >= 1 && cost(a[r][c], 'N') + v.cost < dp[r - 1][c]){ dp[r - 1][c] = cost(a[r][c], 'N') + v.cost; q.push({r - 1, c, dp[r - 1][c]}); } if(r + 1 <= n && cost(a[r][c], 'S') + v.cost < dp[r + 1][c]){ dp[r + 1][c] = cost(a[r][c], 'S') + v.cost; q.push({r + 1, c, dp[r + 1][c]}); } if(c - 1 >= 1 && cost(a[r][c], 'W') + v.cost < dp[r][c - 1]){ dp[r][c - 1] = cost(a[r][c], 'W') + v.cost; q.push({r, c - 1, dp[r][c - 1]}); } if(c + 1 <= m && cost(a[r][c], 'E') + v.cost < dp[r][c + 1]){ dp[r][c + 1] = cost(a[r][c], 'E') + v.cost; q.push({r, c + 1, dp[r][c + 1]}); } } if(dp[n][m] >= (ll)(1e9)) dp[n][m] = -1; cout << dp[n][m] << endl; 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...