QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#799724 | #9662. King of Maze | ucup-team004 | AC ✓ | 238ms | 3728kb | C++23 | 3.5kb | 2024-12-05 17:24:54 | 2024-12-05 17:24:55 |
Judging History
answer
#include <bits/stdc++.h>
using i64 = long long;
using u64 = unsigned long long;
using u32 = unsigned;
using u128 = unsigned __int128;
constexpr int dx[] = {-1, 1, 0, 0};
constexpr int dy[] = {0, 0, -1, 1};
void solve() {
int N, M, Q;
std::cin >> N >> M >> Q;
std::vector<std::string> s(N);
for (int i = 0; i < N; i++) {
std::cin >> s[i];
}
int exit = -1;
auto valid = [&](int x, int y) {
return 0 <= x && x < N && 0 <= y && y < M && s[x][y] != '#';
};
auto idx = [&](int x, int y) {
return x * M + y;
};
std::vector<std::array<int, 2>> lifts;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (s[i][j] == 'E') {
exit = idx(i, j);
}
if (s[i][j] == '?') {
lifts.push_back({i, j});
}
}
}
int K = lifts.size();
std::vector<std::map<int, int>> adj(N * M);
std::vector<int> deg(N * M);
for (int mask = 0; mask < (1 << K); mask++) {
for (int i = 0; i < K; i++) {
auto [x, y] = lifts[i];
if (mask >> i & 1) {
s[x][y] = '#';
} else {
s[x][y] = '.';
}
}
std::vector dis(N * M, -1);
std::queue<int> q;
q.push(exit);
dis[exit] = 0;
while (!q.empty()) {
int u = q.front();
q.pop();
int x = u / M, y = u % M;
for (int k = 0; k < 4; k++) {
int nx = x + dx[k];
int ny = y + dy[k];
if (valid(nx, ny)) {
int v = idx(nx, ny);
if (dis[v] == -1) {
q.push(v);
dis[v] = dis[u] + 1;
}
}
}
}
for (int u = 0; u < N * M; u++) {
if (u == exit) {
continue;
}
int x = u / M, y = u % M;
if (s[x][y] == '#') {
continue;
}
deg[u]++;;
if (dis[u] == -1) {
continue;
}
for (int k = 0; k < 4; k++) {
int nx = x + dx[k];
int ny = y + dy[k];
if (valid(nx, ny)) {
int v = idx(nx, ny);
if (dis[v] == dis[u] - 1) {
adj[v][u]++;
break;
}
}
}
}
}
std::vector<int> ans(N * M, -1);
std::queue<int> q;
q.push(exit);
ans[exit] = 0;
while (!q.empty()) {
int v = q.front();
q.pop();
for (auto [u, w] : adj[v]) {
if ((deg[u] -= w) == 0) {
q.push(u);
ans[u] = ans[v] + 1;
}
}
}
for (int i = 0; i < Q; i++) {
int x, y;
std::cin >> x >> y;
x--;
y--;
int u = idx(x, y);
std::cout << ans[u] << "\n";
}
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int t;
std::cin >> t;
for (int i = 1; i <= t; i++) {
std::cout << "Case " << i << ":\n";
solve();
}
return 0;
}
这程序好像有点Bug,我给组数据试试?
详细
Test #1:
score: 100
Accepted
time: 238ms
memory: 3728kb
input:
100 9 6 43 ###.?. ...... .....? #E..#. ...... .#.... .#.#.. .....# .....# 1 5 3 6 1 4 1 6 2 1 2 2 2 3 2 4 2 5 2 6 3 1 3 2 3 3 3 4 3 5 4 3 4 4 4 6 5 1 5 2 5 3 5 4 5 5 5 6 6 1 6 3 6 4 6 5 6 6 7 1 7 3 7 5 7 6 8 1 8 2 8 3 8 4 8 5 9 1 9 2 9 3 9 4 9 5 8 6 34 ..#... .E.##. ##..#. .....? ?...#. #..#.. #.......
output:
Case 1: 6 5 5 7 3 2 3 4 5 6 2 1 2 3 4 1 2 6 2 1 2 3 4 5 3 3 4 5 6 4 4 6 7 5 6 5 6 7 6 7 6 7 8 Case 2: -1 -1 -1 -1 -1 6 6 -1 -1 2 1 1 1 2 3 5 4 3 4 5 5 4 5 6 5 9 7 6 7 8 -1 7 8 9 Case 3: 2 4 -1 -1 -1 -1 -1 -1 4 3 2 1 1 2 5 3 1 6 7 -1 -1 -1 -1 -1 -1 Case 4: 3 -1 -1 2 2 1 2 3 -1 1 -1 -1 -1 -1 -1 -1 -1 ...
result:
ok 44149 lines
Extra Test:
score: 0
Extra Test Passed