結果

問題 No.1638 Robot Maze
ユーザー atreeatree
提出日時 2021-08-06 22:21:58
言語 C++17
(gcc 13.2.0 + boost 1.83.0)
結果
AC  
実行時間 5 ms / 2,000 ms
コード長 2,943 bytes
コンパイル時間 2,157 ms
コンパイル使用メモリ 218,376 KB
実行使用メモリ 4,496 KB
最終ジャッジ日時 2023-10-17 03:46:16
合計ジャッジ時間 3,710 ms
ジャッジサーバーID
(参考情報)
judge12 / judge14
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
4,348 KB
testcase_01 AC 1 ms
4,348 KB
testcase_02 AC 2 ms
4,348 KB
testcase_03 AC 4 ms
4,496 KB
testcase_04 AC 2 ms
4,348 KB
testcase_05 AC 2 ms
4,348 KB
testcase_06 AC 1 ms
4,348 KB
testcase_07 AC 2 ms
4,348 KB
testcase_08 AC 2 ms
4,348 KB
testcase_09 AC 1 ms
4,348 KB
testcase_10 AC 2 ms
4,348 KB
testcase_11 AC 2 ms
4,348 KB
testcase_12 AC 1 ms
4,348 KB
testcase_13 AC 2 ms
4,348 KB
testcase_14 AC 4 ms
4,348 KB
testcase_15 AC 3 ms
4,348 KB
testcase_16 AC 3 ms
4,348 KB
testcase_17 AC 2 ms
4,348 KB
testcase_18 AC 2 ms
4,348 KB
testcase_19 AC 2 ms
4,348 KB
testcase_20 AC 2 ms
4,348 KB
testcase_21 AC 2 ms
4,348 KB
testcase_22 AC 3 ms
4,348 KB
testcase_23 AC 3 ms
4,348 KB
testcase_24 AC 3 ms
4,348 KB
testcase_25 AC 3 ms
4,348 KB
testcase_26 AC 3 ms
4,348 KB
testcase_27 AC 3 ms
4,348 KB
testcase_28 AC 3 ms
4,348 KB
testcase_29 AC 3 ms
4,348 KB
testcase_30 AC 2 ms
4,348 KB
testcase_31 AC 2 ms
4,348 KB
testcase_32 AC 4 ms
4,388 KB
testcase_33 AC 4 ms
4,440 KB
testcase_34 AC 5 ms
4,472 KB
testcase_35 AC 4 ms
4,448 KB
testcase_36 AC 5 ms
4,476 KB
testcase_37 AC 4 ms
4,388 KB
testcase_38 AC 4 ms
4,384 KB
testcase_39 AC 4 ms
4,468 KB
testcase_40 AC 5 ms
4,404 KB
testcase_41 AC 5 ms
4,444 KB
testcase_42 AC 5 ms
4,444 KB
testcase_43 AC 4 ms
4,436 KB
testcase_44 AC 4 ms
4,444 KB
testcase_45 AC 4 ms
4,436 KB
testcase_46 AC 4 ms
4,460 KB
testcase_47 AC 4 ms
4,420 KB
testcase_48 AC 4 ms
4,472 KB
testcase_49 AC 4 ms
4,392 KB
testcase_50 AC 5 ms
4,436 KB
testcase_51 AC 5 ms
4,472 KB
権限があれば一括ダウンロードができます

ソースコード

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