結果
| 問題 |
No.1638 Robot Maze
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 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);
}