Submission #563408

#TimeUsernameProblemLanguageResultExecution timeMemory
563408KoD로봇 (APIO13_robots)C++17
100 / 100
1375 ms100340 KiB
#include <bits/stdc++.h> using std::pair; using std::tuple; using std::vector; using std::array; constexpr int MAX = 500; constexpr int INF = std::numeric_limits<int>::max() / 2; constexpr int DI[] = {0, 1, 0, -1}; constexpr int DJ[] = {1, 0, -1, 0}; char grid[MAX + 2][MAX + 2]; int dist[MAX + 2][MAX + 2][9][9]; int state[MAX + 2][MAX + 2][4]; pair<int, int> stops[MAX + 2][MAX + 2][4]; pair<int, int> dfs(const int i, const int j, const int k) { if (state[i][j][k] == 2) { return stops[i][j][k]; } if (state[i][j][k] == 1) { return stops[i][j][k] = {i, j}; } state[i][j][k] = 1; int nk = k; if (grid[i][j] == 'A') { nk = (k + 3) % 4; } if (grid[i][j] == 'C') { nk = (k + 1) % 4; } const int ni = i + DI[nk], nj = j + DJ[nk]; if (grid[ni][nj] == 'x') { state[i][j][k] = 2; return stops[i][j][k] = {i, j}; } else { stops[i][j][k] = dfs(ni, nj, nk); if (state[ni][nj][nk] == 1) { stops[i][j][k] = {i, j}; } else { state[i][j][k] = 2; } return stops[i][j][k]; } } int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); int N, H, W; std::cin >> N >> W >> H; H += 2, W += 2; for (int i = 0; i < W; ++i) { grid[0][i] = grid[H - 1][i] = 'x'; } for (int i = 0; i < H; ++i) { grid[i][0] = grid[i][W - 1] = 'x'; } for (int i = 1; i < H - 1; ++i) { for (int j = 1; j < W - 1; ++j) { std::cin >> grid[i][j]; } } for (int i = 0; i < H; ++i) { for (int j = 0; j < W; ++j) { for (int k = 0; k < N; ++k) { for (int l = 0; l < N; ++l) { dist[i][j][k][l] = INF; } } } } for (int len = 0; len < N; ++len) { for (int l = 0; l + len < N; ++l) { const int r = l + len; vector<vector<pair<int, int>>> buf(MAX * MAX + 1); if (len == 0) { for (int i = 0; i < H; ++i) { for (int j = 0; j < W; ++j) { if (grid[i][j] - '1' == l) { dist[i][j][l][r] = 0; buf[0].emplace_back(i, j); } } } } else { for (int i = 0; i < H; ++i) { for (int j = 0; j < W; ++j) { int min = INF; for (int k = l; k < r; ++k) { min = std::min(min, dist[i][j][l][k] + dist[i][j][k + 1][r]); } dist[i][j][l][r] = min; if (min < MAX * MAX) { buf[min].emplace_back(i, j); } } } } for (int d = 0; d < MAX * MAX; ++d) { for (const auto& [i, j] : buf[d]) { for (int k = 0; k < 4; ++k) { const auto [ni, nj] = dfs(i, j, k); if (dist[ni][nj][l][r] > d + 1) { dist[ni][nj][l][r] = d + 1; buf[d + 1].emplace_back(ni, nj); } } } } } } int ans = INF; for (int i = 0; i < H; ++i) { for (int j = 0; j < W; ++j) { ans = std::min(ans, dist[i][j][0][N - 1]); } } std::cout << (ans == INF ? -1 : ans) << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...