이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
// Call my Name and Save me from The Dark
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef pair<int, int> pii;
#define SZ(x) (int) x.size()
#define F first
#define S second
const int N = 1e3 + 10, MOD = 1e9 + 7;
int R[N][N], L[N][N], U[N][N], D[N][N], A[N][N], pd[N * N], dp[N * N], M[N], dx[] = {0, 0, -1, 1}, dy[] = {-1, 1, 0, 0}, n, m, st, en;
vector<pii> adj[N]; char S[N]; queue<int> Q;
int id(int x, int y) {
return x * (m + 1) + y;
}
inline void add_edge(int u, int v, int w) {
adj[u].push_back({v, w});
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%s", S + 1);
for (int j = 1; j <= m; j++) {
if (S[j] == '#') A[i][j] = 0;
else if (S[j] == 'S') A[i][j] = 1, st = id(i, j);
else if (S[j] == 'C') A[i][j] = 1, en = id(i, j);
else A[i][j] = 1;
}
}
fill(dp, dp + N * N, MOD);
fill(pd, pd + N * N, MOD);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (!A[i][j]) continue;
for (int d = 0; d < 4; d++) {
int nx = i + dx[d], ny = j + dy[d];
if (nx <= 0 || nx > n || ny <= 0 || ny > m || !A[nx][ny]) continue;
add_edge(id(i, j), id(nx, ny), 1);
}
if (SZ(adj[id(i, j)]) != 4) dp[id(i, j)] = 1, Q.push(id(i, j));
}
}
while (SZ(Q)) {
int v = Q.front(); Q.pop();
for (pii u : adj[v]) {
if (dp[u.F] > dp[v] + u.S) {
dp[u.F] = dp[v] + u.S;
Q.push(u.F);
}
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (!A[i][j - 1]) L[i][j] = j;
else L[i][j] = L[i][j - 1];
}
for (int j = m; j >= 1; j--) {
if (!A[i][j + 1]) R[i][j] = j;
else R[i][j] = R[i][j + 1];
}
}
for (int j = 1; j <= m; j++) {
for (int i = 1; i <= n; i++) {
if (!A[i - 1][j]) U[i][j] = i;
else U[i][j] = U[i - 1][j];
}
for (int i = n; i; i--) {
if (!A[i + 1][j]) D[i][j] = i;
else D[i][j] = D[i + 1][j];
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (!A[i][j]) continue;
int v = id(i, j), l = id(i, L[i][j]), r = id(i, R[i][j]), u = id(U[i][j], j), d = id(D[i][j], j);
add_edge(v, u, dp[v]);
add_edge(v, l, dp[v]);
add_edge(v, d, dp[v]);
add_edge(v, r, dp[v]);
}
}
priority_queue<pii> pq;
pq.push({pd[st] = 0, st});
while (SZ(pq)) {
int v = pq.top().S; pq.pop();
if (M[v]) continue;
M[v] = 1;
for (pii u : adj[v]) {
if (pd[u.F] > pd[v] + u.S) {
pd[u.F] = pd[v] + u.S;
pq.push({-pd[u.F], u.F});
}
}
}
printf("%d\n", pd[en]);
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
portals.cpp: In function 'int main()':
portals.cpp:26:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
26 | scanf("%d%d", &n, &m);
| ~~~~~^~~~~~~~~~~~~~~~
portals.cpp:28:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
28 | scanf("%s", S + 1);
| ~~~~~^~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |