Advertisement
MagicWinnie

3

Jan 14th, 2022
781
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.89 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cmath>
  3. #include <queue>
  4. #include <string>
  5. #include <iostream>
  6. using namespace std;
  7.  
  8. #define next abacabadabacaba
  9.  
  10. const int MAX = 3000;
  11. int field[MAX][MAX + 1];
  12.  
  13. const int dx[] = {-1, 0, 1, 0};
  14. const int dy[] = {0, 1, 0, -1};
  15.  
  16. int next[MAX][MAX][4];
  17.  
  18. bool canGo[MAX][MAX];
  19.  
  20. int main() {
  21.     freopen("alligator.in", "r", stdin);
  22.     freopen("alligator.out", "w", stdout);
  23.  
  24.     int n, m;
  25.     scanf("%d%d\n", &n, &m);
  26.     string dir("NESW.");
  27.     for (int i = 0; i < n; i++) {
  28.         char buf[MAX + 1];
  29.         scanf("%s\n", buf);
  30.         for (int j = 0; j < m; j++) {
  31.             field[i][j] = dir.find(buf[j]);
  32.         }
  33.     }
  34.  
  35.     queue < pair<int, int> > q;
  36.  
  37.     for (int i = 0; i < n; i++) {
  38.         for (int j = 0; j < m; j++) {
  39.             if (i == 0 || field[i - 1][j] < 4) {
  40.                 next[i][j][0] = i - 1;
  41.             } else {
  42.                 next[i][j][0] = next[i - 1][j][0];
  43.             }
  44.             if (j == 0 || field[i][j - 1] < 4) {
  45.                 next[i][j][3] = j - 1;
  46.             } else {
  47.                 next[i][j][3] = next[i][j - 1][3];
  48.             }
  49.         }
  50.     }
  51.    
  52.     for (int i = n - 1; i >= 0; i--) {
  53.         for (int j = m - 1; j >= 0; j--) {
  54.             if (i == n - 1 || field[i + 1][j] < 4) {
  55.                 next[i][j][2] = i + 1;
  56.             } else {
  57.                 next[i][j][2] = next[i + 1][j][2];
  58.             }
  59.             if (j == m - 1 || field[i][j + 1] < 4) {
  60.                 next[i][j][1] = j + 1;
  61.             } else {
  62.                 next[i][j][1] = next[i][j + 1][1];
  63.             }
  64.         }
  65.     }
  66.  
  67.     for (int i = 0; i < n; i++) {
  68.         for (int j = 0; j < m; j++) {
  69.             for (int k = 0; k < 4; k++) {
  70.                 int bound = k % 2 == 0 ? n : m;
  71.                 if (field[i][j] == k && (next[i][j][k] == -1 || next[i][j][k] == bound)) {
  72.                     canGo[i][j] = true;
  73.                     q.push(make_pair(i, j));
  74.                 }
  75.             }
  76.         }
  77.     }
  78.  
  79.  
  80.     int ans = 0;
  81.     while (!q.empty()) {
  82.         pair<int, int> p = q.front();
  83.         q.pop();
  84.         ans++;
  85.  
  86.         int i = p.first;
  87.         int j = p.second;
  88.  
  89.         for (int k = 0; k < 4; k++) {
  90.             int ni = i;
  91.             int nj = j;
  92.             if (dx[k] != 0) {
  93.                 ni = next[i][j][k];
  94.             } else {
  95.                 nj = next[i][j][k];
  96.             }
  97.             if (0 <= ni && ni < n && 0 <= nj && nj < m) {
  98.                 int nk = k ^ 2;
  99.                 next[ni][nj][nk] = next[i][j][nk];
  100.                 int bound = nk % 2 == 0 ? n : m;
  101.                 if (nk == field[ni][nj] && !canGo[ni][nj] && (next[ni][nj][nk] == -1 || next[ni][nj][nk] == bound)) {
  102.                     canGo[ni][nj] = true;
  103.                     q.push(make_pair(ni, nj));
  104.                 }
  105.             }
  106.         }
  107.     }
  108.  
  109.     printf("%d\n", ans);
  110.  
  111.     return 0;
  112. }
  113.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement