Guest User

Untitled

a guest
Oct 30th, 2016
393
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.64 KB | None | 0 0
  1. /*
  2. ID: <REDACTED>
  3. LANG: C++14
  4. TASK: snail
  5. */
  6.  
  7. #include <bits/stdc++.h>
  8.  
  9. using namespace std;
  10.  
  11. typedef vector <int> vi;
  12.  
  13. #define f0r(i, a) for (int i = 0; i < a; i++)
  14.  
  15. template <class T> inline void setmax (T &x,T y) { x = max(x, y); }
  16.  
  17. const int MAX = 125;
  18.  
  19. int n, b;
  20.  
  21. int visit[MAX][MAX];
  22. vi dr = {-1, 0, 1, 0};  // 0 is up, 1 is right, 2 is down, 3 is left
  23. vi dc = {0, 1, 0, -1};
  24.  
  25. bool valid(int r, int c) {  // Checks whether or not the coordinate is in the board
  26.     return r >= 0 && r < n && c >= 0 && c < n;
  27. }
  28.  
  29. int dfs (int r, int c, int dir) {
  30.     visit[r][c] = 1;
  31.    
  32.     int ans = 0;
  33.     if (valid(r + dr[dir], c + dc[dir]) && visit[r + dr[dir]][c + dc[dir]] == 0)    // It is empty
  34.         ans = dfs(r + dr[dir], c + dc[dir], dir);
  35.     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)
  36.         ans = 0;
  37.     else {  // We reached border or barrier and must turn
  38.         int left = (dir + 3) % 4;
  39.         int right = (dir + 1) % 4;
  40.         if (valid(r + dr[left], c + dc[left]) && visit[r + dr[left]][c + dc[left]] == 0)
  41.             setmax(ans, dfs(r + dr[left], c + dc[left], left));
  42.         if (valid(r + dr[right], c + dc[right]) && visit[r + dr[right]][c + dc[right]] == 0)
  43.             setmax(ans, dfs(r + dr[right], c + dc[right], right));
  44.     }
  45.    
  46.     visit[r][c] = 0;
  47.     return ans + 1;
  48. }
  49.  
  50. int main() {
  51.     //freopen("snail.in", "r", stdin);
  52.     //freopen("snail.out", "w", stdout);
  53.    
  54.     f0r (i, MAX) f0r (j, MAX)
  55.         visit[i][j] = 0;
  56.  
  57.     scanf(" %d %d ", &n, &b);
  58.    
  59.     char c;
  60.     int r;
  61.     f0r (i, b) {
  62.         scanf(" %c %d ", &c, &r);
  63.         visit[r - 1][c - 'A'] = 2;
  64.     }
  65.    
  66.     cout << max(dfs(0, 0, 1), dfs(0, 0, 2)) << endl;
  67. }
Add Comment
Please, Sign In to add comment