結果

問題 No.1638 Robot Maze
ユーザー atreeatree
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #

#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);
}
0