Submission #1174901

#TimeUsernameProblemLanguageResultExecution timeMemory
1174901andriy57Awesome Arrowland Adventure (eJOI19_adventure)C++20
100 / 100
34 ms10932 KiB
#define _CRT_SECURE_NO_WARNINGS #include <bits/stdc++.h> using namespace std; #define forin for(int i = 1; i <= n; i++) #define stforin for(int i = 0; i < n; i++) #define forim for(int i = 1; i <= m; i++) #define forjn for(int j = 1; j <= n; j++) #define forch(j, n) for(int i = j; i <= n; i++) #define forch2(i, j, n) for(int i = j; i <= n; i++) #define forjm for(int j = 1; j <= m; j++) #define lol long long #define lb long double #define all(a) (x).begin(), (x).end(); #define endl '\n' #define debug cout << "Completed" << endl; #define fix(n, m) cout << fixed; cout.precision(m); cout << n << endl #define Yes cout << "YES" << endl #define No cout << "NO" << endl #define bads cout << -1 << endl #define pll pair<lol, lol> #define mod 1000000007 #define fst first #define snd second #define inf 1e15 #define tofix cin ; string sbuf; ostringstream buf(sbuf); istringstream atcin(sbuf); lol gcd(lol a, lol b) { while (a != 0 && b != 0) if (a > b) a %= b; else b %= a; return a + b; } lol lcm(lol a, lol b) { return a / gcd(a, b) * b; } bool issqrt(lol n) { lb x = sqrt(n); if (x == (lol)x) return 1; return 0; } lol easy(lol n) { if (n == 1) return 0; for (int i = 2; i * i <= n; i++) if (n % i == 0) return 0; return 1; } string bin(lol v) { string ans; while (v != 0) { ans += to_string((v % 2)); v /= 2; } return ans; } //priority_queue <pll, vector<pll>, greater<pll>> q const long long N = 1e3 + 10; lol m, n, d[N][N], x, y, di, dx[4] = { -1, 0, 1, 0 }, dy[4] = { 0, 1, 0, -1 }, el, tox, toy; char dir[4] = { 'N', 'E', 'S', 'W' }; string s[N]; struct dk { lol x, y, d; bool operator > (const dk& v1) const { return d > v1.d; } }; priority_queue <dk, vector<dk>, greater<dk>> q; lol deika() { while (!q.empty()) { auto v = q.top(); q.pop(); x = v.x; y = v.y; di = v.d; if (x == m - 1 && y == n - 1) return di; if (di > d[x][y] || s[x][y] == 'X') continue; forch(0, 3) { tox = x + dx[i]; toy = y + dy[i]; if (tox < 0 || toy < 0 || tox >= m || toy >= n) continue; if (s[x][y] == dir[i]) el = 0; else if (s[x][y] == dir[(i + 3) % 4]) el = 1; else if (s[x][y] == dir[(i + 2) % 4]) el = 2; else el = 3; if (d[tox][toy] > di + el) { d[tox][toy] = di + el; q.push({ tox, toy, d[tox][toy] }); } } } return -1; } int main() { cin >> m >> n; forch(0, m - 1) cin >> s[i]; forch(0, m - 1) forch2(j, 0, n - 1) d[i][j] = inf; q.push({ 0, 0, 0 }); d[0][0] = 0; cout << deika() << 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...