Submission #241305

# Submission time Handle Problem Language Result Execution time Memory
241305 2020-06-23T19:29:39 Z dolphingarlic Robots (APIO13_robots) C++14
100 / 100
924 ms 126044 KB
#include <bits/stdc++.h>
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("O3")
#pragma GCC target("sse4,avx2,fma,avx")
#define FOR(i, x, y) for (int i = x; i < y; i++)
typedef long long ll;
using namespace std;

const int INF = 250000;

int n, h, w;
char g[500][500];
pair<int, int> end_pos[500][500][4];
int dp[500][500][9][9];
vector<pair<int, int>> q[INF];

inline bool inside(int x, int y) {
	return (x >= 0 && y >= 0 && x < h && y < w && g[x][y] != 'x');
}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cin >> n >> w >> h;
	memset(dp, 0x3f, sizeof(dp));

	FOR(i, 0, h) FOR(j, 0, w) {
		cin >> g[i][j];
		if (g[i][j] - '0' > 0 && g[i][j] - '0' < 10) {
			dp[i][j][g[i][j] - '1'][g[i][j] - '1'] = 0;
		}
		FOR(k, 0, 4) end_pos[i][j][k] = {-1, -1};
	}

	// Determine final positions from each push
	FOR(i, 0, h) FOR(j, 0, w) if (g[i][j] != 'x') {
		FOR(k, 0, 4) {
			pair<int, int> pos = {i, j};
			int d = (k + (g[i][j] == 'A') * 3 + (g[i][j] == 'C')) % 4;  // NESW

			while (true) {
				if (d == 0) {
					if (inside(pos.first - 1, pos.second)) pos.first--;
					else break;
				} else if (d == 1) {
					if (inside(pos.first, pos.second + 1)) pos.second++;
					else break;
				} else if (d == 2) {
					if (inside(pos.first + 1, pos.second)) pos.first++;
					else break;
				} else {
					if (inside(pos.first, pos.second - 1)) pos.second--;
					else break;
				}

				if (~end_pos[pos.first][pos.second][d].first) {
					pos = end_pos[pos.first][pos.second][d];
					break;
				}

				if (g[pos.first][pos.second] == 'A') d = (d + 3) % 4;
				if (g[pos.first][pos.second] == 'C') d = (d + 1) % 4;
			}

			end_pos[i][j][k] = pos;
		}
	}

	// Find the minimum no. of pushes to get robot k-l to block (i, j)
	FOR(rng, 0, n) {
		FOR(k, 0, n - rng) {
			int l = k + rng;
			FOR(i, 0, h) FOR(j, 0, w) if (g[i][j] != 'x') {
				FOR(d, k, l) {
					dp[i][j][k][l] =
						min(dp[i][j][k][l],
							dp[i][j][k][d] + dp[i][j][d + 1][l]);
				}
			}
		}

		FOR(k, 0, n - rng) {
			int l = k + rng;

			FOR(i, 0, h) FOR(j, 0, w) if (g[i][j] != 'x') {
				if (dp[i][j][k][l] <= INF) q[dp[i][j][k][l]].push_back({i, j});
			}
			
			FOR(i, 0, INF) {
				for (pair<int, int> pos : q[i]) {
					int x, y;
					tie(x, y) = pos;
					if (dp[x][y][k][l] == i) {
						FOR(d, 0, 4) {
							int nx, ny;
							tie(nx, ny) = end_pos[x][y][d];
							if (dp[nx][ny][k][l] > dp[x][y][k][l] + 1) {
								q[dp[nx][ny][k][l] = dp[x][y][k][l] + 1].push_back({nx, ny});
							}
						}
					}
				}
				q[i].clear();
			}
		}
	}

	int ans = INT_MAX;
	FOR(i, 0, h) FOR(j, 0, w) ans = min(ans, dp[i][j][0][n - 1]);
	cout << (ans > INF ? -1 : ans);
	return 0;
}

Compilation message

robots.cpp: In function 'int main()':
robots.cpp:77:42: warning: array subscript is above array bounds [-Warray-bounds]
        dp[i][j][k][d] + dp[i][j][d + 1][l]);
                         ~~~~~~~~~~~~~~~~~^
robots.cpp:77:39: warning: array subscript is above array bounds [-Warray-bounds]
        dp[i][j][k][d] + dp[i][j][d + 1][l]);
                         ~~~~~~~~~~~~~~^
robots.cpp:75:19: warning: array subscript is above array bounds [-Warray-bounds]
      dp[i][j][k][l] =
      ~~~~~~~~~~~~~^
# Verdict Execution time Memory Grader output
1 Correct 55 ms 85496 KB Output is correct
2 Correct 49 ms 85496 KB Output is correct
3 Correct 51 ms 85496 KB Output is correct
4 Correct 53 ms 85596 KB Output is correct
5 Correct 50 ms 85496 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 55 ms 85496 KB Output is correct
2 Correct 49 ms 85496 KB Output is correct
3 Correct 51 ms 85496 KB Output is correct
4 Correct 53 ms 85596 KB Output is correct
5 Correct 50 ms 85496 KB Output is correct
6 Correct 52 ms 85496 KB Output is correct
7 Correct 52 ms 85496 KB Output is correct
8 Correct 51 ms 85504 KB Output is correct
9 Correct 51 ms 85496 KB Output is correct
10 Correct 50 ms 85496 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 55 ms 85496 KB Output is correct
2 Correct 49 ms 85496 KB Output is correct
3 Correct 51 ms 85496 KB Output is correct
4 Correct 53 ms 85596 KB Output is correct
5 Correct 50 ms 85496 KB Output is correct
6 Correct 52 ms 85496 KB Output is correct
7 Correct 52 ms 85496 KB Output is correct
8 Correct 51 ms 85504 KB Output is correct
9 Correct 51 ms 85496 KB Output is correct
10 Correct 50 ms 85496 KB Output is correct
11 Correct 230 ms 93688 KB Output is correct
12 Correct 61 ms 90104 KB Output is correct
13 Correct 133 ms 89720 KB Output is correct
14 Correct 311 ms 98724 KB Output is correct
15 Correct 166 ms 90760 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 55 ms 85496 KB Output is correct
2 Correct 49 ms 85496 KB Output is correct
3 Correct 51 ms 85496 KB Output is correct
4 Correct 53 ms 85596 KB Output is correct
5 Correct 50 ms 85496 KB Output is correct
6 Correct 52 ms 85496 KB Output is correct
7 Correct 52 ms 85496 KB Output is correct
8 Correct 51 ms 85504 KB Output is correct
9 Correct 51 ms 85496 KB Output is correct
10 Correct 50 ms 85496 KB Output is correct
11 Correct 230 ms 93688 KB Output is correct
12 Correct 61 ms 90104 KB Output is correct
13 Correct 133 ms 89720 KB Output is correct
14 Correct 311 ms 98724 KB Output is correct
15 Correct 166 ms 90760 KB Output is correct
16 Correct 558 ms 93692 KB Output is correct
17 Correct 924 ms 126044 KB Output is correct
18 Correct 342 ms 97752 KB Output is correct
19 Correct 406 ms 93688 KB Output is correct
20 Correct 628 ms 108724 KB Output is correct