제출 #660652

#제출 시각아이디문제언어결과실행 시간메모리
660652USER로봇 (APIO13_robots)C++14
60 / 100
1581 ms92292 KiB
#include <bits/stdc++.h> using namespace std; typedef pair <int, int> pr; int k, n, m, a[501][501][9][9]; char c[501][501]; const int inf = 1000000000; pr go[4][501][501]; struct nod{ int i, j; unsigned l, r; bool operator < (const nod& aux) const { return a[i][j][l][r] > a[aux.i][aux.j][aux.l][aux.r]; } }; priority_queue <nod> Q; void afis(pr aux) { cout << aux.first << ' ' << aux.second << '\n'; } // 0 - Up, 1 - Left, 2 - Down, 3 - Right int d1[] = { -1, 0, 1, 0 }; int d2[] = { 0, 1, 0, -1 }; inline bool in(int i, int j) { return i >= 1 && i <= n && j >= 1 && j <= m; } inline void prev(int& dir) { dir--; if (dir == -1) dir = 3; } inline void next(int& dir) { dir++; if (dir == 4) dir = 0; } pr get(int dir, int i, int j) { if (!in(i, j) || c[i][j] == 'x') { next(dir); next(dir); return { i + d1[dir], j + d2[dir] }; } if (go[dir][i][j].first) return go[dir][i][j]; int nxDir = dir; if (c[i][j] == 'A') prev(nxDir); else if (c[i][j] == 'C') next(nxDir); pr aux = get(nxDir, i + d1[nxDir], j + d2[nxDir]); go[dir][i][j] = aux; return aux; } inline bool digit(char c) { return c >= '0' && c <= '9'; } bool update(pr p, int val, int l, int r) { if (a[p.first][p.second][l][r] > val) { a[p.first][p.second][l][r] = val; return 1; } return 0; } void lee() { int l, r, i, j, x, y; while (!Q.empty()) { i = Q.top().i; j = Q.top().j; l = Q.top().l; r = Q.top().r; Q.pop(); for (int p = 0; p <= 3; p++) { x = go[p][i][j].first; y = go[p][i][j].second; if (update({ x, y }, a[i][j][l][r] + 1, l, r)) Q.push({ x, y, unsigned(l), unsigned(r)}); } } } int main() { cin >> k >> m >> n; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) { for (int l = 0; l < k; l++) for (int p = 0; p < k; p++) a[i][j][l][p] = inf; cin >> c[i][j]; if (isdigit(c[i][j])) c[i][j]--; } for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) for (int l = 0; l <= 3; l++) get(l, i, j); for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) if (digit(c[i][j])) { int aux = (c[i][j] - '0'); update({ i, j }, 0, aux, aux); Q.push({ i, j, unsigned(aux), unsigned(aux) }); lee(); } for (int l = 2; l <= k; l++) for (int p = 0; p < k - l + 1; p++) { int q = p + l - 1; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) { for (int t = p; t < q; t++) update({ i, j }, a[i][j][p][t] + a[i][j][t + 1][q], p, q); Q.push({ i, j, unsigned(p), unsigned(q)}); } lee(); } int mini = inf; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) mini = min(mini, a[i][j][0][k - 1]); if (mini == inf) cout << -1; else cout << mini; 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...