結果

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

ソースコード

diff #
プレゼンテーションモードにする

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