結果
問題 | No.5006 Hidden Maze |
ユーザー |
![]() |
提出日時 | 2022-06-12 14:47:08 |
言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 67 ms / 2,000 ms |
コード長 | 3,367 bytes |
コンパイル時間 | 1,932 ms |
実行使用メモリ | 22,856 KB |
スコア | 43,912 |
平均クエリ数 | 561.88 |
最終ジャッジ日時 | 2022-06-12 14:47:21 |
合計ジャッジ時間 | 10,211 ms |
ジャッジサーバーID (参考情報) |
judge16 / judge13 |
純コード判定しない問題か言語 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 100 |
ソースコード
#include <bits/stdc++.h>using namespace std;using ll = long long;constexpr int N = 20;struct Graph {static constexpr ll INF = 1LL << 60;struct VertexQ {bool operator<(const VertexQ &o) const {return c > o.c; // 逆}int i;ll c;};struct Vertex { int n; int d; ll c; };struct Edge { int i, n, c; };Graph(int n, int m) : v(n, { -1, -1, INF }), e(m), n(n), m(0) {}void add_edge(int a, int b, int c) {e[m] = { b, v[a].n, c };v[a].n = m;m++;}void dijkstra(int i, int j) {for (int i = 0; i < n; i++) v[i].c = INF;priority_queue<VertexQ> q;q.push({ i, v[i].c = 0 });while (!q.empty()) {auto p = q.top(); q.pop();if (p.i == j) break;if (p.c > v[p.i].c) continue;for (int j = v[p.i].n; j >= 0; j = e[j].n) {Edge &o = e[j];ll c = p.c + o.c;if (c < v[o.i].c) v[o.i].d = p.i, q.push({ o.i, v[o.i].c = c });}}}vector<Vertex> v;vector<Edge> e;int n, m;};int c0[N][N];int c1[N][N];int main() {int h, w, p;cin >> h >> w >> p;for (int i = 0; i < N; i++) {for (int j = 0; j < N; j++) {c0[i][j] = c1[i][j] = 10;}}while (1) {Graph g(N * N, N * N * 4);for (int i = 0; i < N; i++) {for (int j = 0; j < N - 1; j++) {int k = i * N + j;g.add_edge(k, k + 1, c0[i][j]);g.add_edge(k + 1, k, c0[i][j]);}}for (int i = 0; i < N - 1; i++) {for (int j = 0; j < N; j++) {int k = i * N + j;g.add_edge(k, k + N, c1[i][j]);g.add_edge(k + N, k, c1[i][j]);}}int k = N * N - 1;g.dijkstra(0, k);string s;vector<int> t;t.push_back(k);while (1) {int k1 = g.v[k].d;int d = k - k1;char x;if (d == 1) x = 'R'; else if (d == -1) x = 'L'; else if (d == N) x = 'D'; else x = 'U';s.push_back(x);t.push_back(k1);k = k1;if (k == 0) break;}reverse(s.begin(), s.end());reverse(t.begin(), t.end());cout << s << endl;int a;cin >> a;if (a == -1) break;auto f = [&](int &c, int y) {if (y == 0) {c = 0;} else {if (c > 0) c++;}};for (int b = 0; b <= a; b++) {int k0 = t[b], k1 = t[b + 1];if (k0 > k1) swap(k0, k1);int i = k0 / N, j = k0 % N;if (abs(k0 - k1) == 1) {f(c0[i][j], b == a);} else {f(c1[i][j], b == a);}}//for (int i = 0; i < N; i++) {// for (int j = 0; j < N - 1; j++) {// cout << c0[i][j] << ' ';// }// cout << '\n';//}//for (int i = 0; i < N - 1; i++) {// for (int j = 0; j < N; j++) {// cout << c1[i][j] << ' ';// }// cout << '\n';//}}return 0;}