結果
問題 | No.1638 Robot Maze |
ユーザー | atree |
提出日時 | 2021-08-06 22:21:58 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 5 ms / 2,000 ms |
コード長 | 2,943 bytes |
コンパイル時間 | 2,063 ms |
コンパイル使用メモリ | 210,280 KB |
最終ジャッジ日時 | 2025-01-23 15:45:31 |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 49 |
ソースコード
#include <bits/stdc++.h> using namespace std; #define overload3(_1, _2, _3, name, ...) name #define rep1(n) for (decltype(n) _tmp = 0; _tmp < (n); _tmp++) #define rep2(i, n) for (decltype(n) i = 0; i < (n); i++) #define rep3(i, a, b) for (decltype(b) i = a; i < (b); i++) #define rep(...) overload3(__VA_ARGS__, rep3, rep2, rep1)(__VA_ARGS__) #if __has_include(<debug.hpp>) #include <debug.hpp> #else #define dbg(...) (void(0)) #endif struct IOSetup { IOSetup() noexcept { ios::sync_with_stdio(false); cin.tie(nullptr); cout << fixed << setprecision(10); cerr << fixed << setprecision(10); } } iosetup; template<class T> void drop(const T &x) { cout << x << "\n"; exit(0); } template<class T> bool chmax(T &a, const T &b) { return a < b and (a = b, true); } template<class T> bool chmin(T &a, const T &b) { return a > b and (a = b, true); } using i64 = long long; using f64 = long double; /** * @brief Dijkstra's Algorithm * @note Find SSSP;Single Source Shortest Path in $O(|E|log|V|)$. There must be no negative edges. Return -1 for unreachable vertex. */ template<class T = i64> vector<T> dijkstra(vector<vector<pair<size_t, T>>> const &graph, size_t root) { static_assert(is_signed<T>::value, "template parameter T must be signed type!"); using P = pair<T, size_t>; constexpr T INF = numeric_limits<T>::max() / 2; vector<T> dist(size(graph), INF); priority_queue<P, vector<P>, greater<>> pq; pq.emplace(dist[root] = 0, root); while (not empty(pq)) { const auto [c, from] = pq.top(); pq.pop(); if (dist[from] < c) continue; for (const auto &[to, cost]: graph[from]) if (chmin(dist[to], dist[from] + cost)) pq.emplace(dist[to], to); } for (auto &&e: dist) if (e == INF) e = -1; return dist; } int main() { size_t h, w, sx, sy, gx, gy; i64 u, d, r, l, k, p; cin >> h >> w >> u >> d >> r >> l >> k >> p >> sx >> sy >> gx >> gy; vector<string> grid(h); for (auto &&i: grid) cin >> i; vector graph(h * w, vector<pair<size_t, i64>>{}); auto ind = [&w](size_t i, size_t j) { return w * i + j; }; rep(i, h) rep(j, w) { if (i > 0 and grid[i - 1][j] != '#') graph[ind(i, j)].emplace_back(pair{ind(i - 1, j), u + p * (grid[i - 1][j] == '@')}); if (j > 0 and grid[i][j - 1] != '#') graph[ind(i, j)].emplace_back(pair{ind(i, j - 1), l + p * (grid[i][j - 1] == '@')}); if (i + 1 < h and grid[i + 1][j] != '#') graph[ind(i, j)].emplace_back(pair{ind(i + 1, j), d + p * (grid[i + 1][j] == '@')}); if (j + 1 < w and grid[i][j + 1] != '#') graph[ind(i, j)].emplace_back(pair{ind(i, j + 1), r + p * (grid[i][j + 1] == '@')}); } auto dist = dijkstra(graph, ind(sx - 1, sy - 1)); auto ans = dist[ind(gx - 1, gy - 1)] <= k and dist[ind(gx - 1, gy - 1)] != -1; cout << (ans ? "Yes\n" : "No\n"); dbg(graph); dbg(dist); }