Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- ID: <REDACTED>
- LANG: C++14
- TASK: snail
- */
- #include <bits/stdc++.h>
- using namespace std;
- typedef vector <int> vi;
- #define f0r(i, a) for (int i = 0; i < a; i++)
- template <class T> inline void setmax (T &x,T y) { x = max(x, y); }
- const int MAX = 125;
- int n, b;
- int visit[MAX][MAX];
- vi dr = {-1, 0, 1, 0}; // 0 is up, 1 is right, 2 is down, 3 is left
- vi dc = {0, 1, 0, -1};
- bool valid(int r, int c) { // Checks whether or not the coordinate is in the board
- return r >= 0 && r < n && c >= 0 && c < n;
- }
- int dfs (int r, int c, int dir) {
- visit[r][c] = 1;
- int ans = 0;
- if (valid(r + dr[dir], c + dc[dir]) && visit[r + dr[dir]][c + dc[dir]] == 0) // It is empty
- ans = dfs(r + dr[dir], c + dc[dir], dir);
- else if (valid(r + dr[dir], c + dc[dir]) && visit[r + dr[dir]][c + dc[dir]] == 1) // We have visited it before (already part of our path)
- ans = 0;
- else { // We reached border or barrier and must turn
- int left = (dir + 3) % 4;
- int right = (dir + 1) % 4;
- if (valid(r + dr[left], c + dc[left]) && visit[r + dr[left]][c + dc[left]] == 0)
- setmax(ans, dfs(r + dr[left], c + dc[left], left));
- if (valid(r + dr[right], c + dc[right]) && visit[r + dr[right]][c + dc[right]] == 0)
- setmax(ans, dfs(r + dr[right], c + dc[right], right));
- }
- visit[r][c] = 0;
- return ans + 1;
- }
- int main() {
- //freopen("snail.in", "r", stdin);
- //freopen("snail.out", "w", stdout);
- f0r (i, MAX) f0r (j, MAX)
- visit[i][j] = 0;
- scanf(" %d %d ", &n, &b);
- char c;
- int r;
- f0r (i, b) {
- scanf(" %c %d ", &c, &r);
- visit[r - 1][c - 'A'] = 2;
- }
- cout << max(dfs(0, 0, 1), dfs(0, 0, 2)) << endl;
- }
Add Comment
Please, Sign In to add comment