zhukov000

Crocks

Mar 11th, 2020
370
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.69 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define F first
  3. #define S second
  4.  
  5. using namespace std;
  6.  
  7. vector< string > field;
  8. // true if can out
  9. vector< vector< bool > > vup, vdown, vleft, vright;
  10. queue< pair<int, int> > out;
  11. int n, m;
  12.  
  13. void solve()
  14. {
  15.   int ans = 0;
  16.   while( out.size() > 0 )
  17.   {
  18.     pair<int, int> crock = out.front();
  19.     int ci = crock.F, cj = crock.S;
  20.     char dir = field[ci][cj];
  21.     out.pop();
  22.     if (dir == '.') continue;
  23.     ans++;
  24.     field[ci][cj] = '.';
  25.     if (dir != 'N' && vdown[ci+1][cj]) // vdown
  26.     {
  27.       vdown[ci][cj] = true;
  28.       for(int i=ci-1; i>=0; --i)
  29.         if (field[i][cj] == '.')
  30.           vdown[i][cj] = true;
  31.         else if (field[i][cj] == 'S')
  32.         {
  33.           vdown[i][cj] = true;
  34.           out.push({i, cj});
  35.           break;
  36.         }
  37.         else
  38.           break;
  39.     }
  40.     if (dir != 'S' && vup[ci-1][cj]) // vup
  41.     {
  42.       vup[ci][cj] = true;
  43.       for(int i=ci+1; i<n+2; ++i)
  44.         if (field[i][cj] == '.')
  45.           vup[i][cj] = true;
  46.         else if (field[i][cj] == 'N')
  47.         {
  48.           vup[i][cj] = true;
  49.           out.push({i, cj});
  50.           break;
  51.         }
  52.         else
  53.           break;
  54.     }
  55.     if (dir != 'W' && vright[ci][cj+1]) // vright
  56.     {
  57.       vright[ci][cj] = true;
  58.       for(int j=cj-1; j>=0; --j)
  59.         if (field[ci][j] == '.')
  60.           vright[ci][j] = true;
  61.         else if(field[ci][j] == 'E')
  62.         {
  63.           vright[ci][j] = true;
  64.           out.push({ci, j});
  65.           break;
  66.         }
  67.         else
  68.           break;
  69.     }
  70.     if (dir != 'E' && vleft[ci][cj-1]) // vleft
  71.     {
  72.       vleft[ci][cj] = true;
  73.       for(int j=cj+1; j<m+2; ++j)
  74.         if (field[ci][j] == '.')
  75.           vleft[ci][j] = true;
  76.         else if(field[ci][j] == 'W')
  77.         {
  78.           vleft[ci][j] = true;
  79.           out.push({ci, j});
  80.           break;
  81.         }
  82.         else
  83.           break;
  84.     }
  85.   }
  86.   cout << ans;
  87. }
  88.  
  89. void read_data()
  90. {
  91.   std::ios::sync_with_stdio(false);
  92.   cin.tie(0);
  93.   cout.tie();
  94.   #ifdef AZHUKOV
  95.   freopen("input.txt", "r", stdin);
  96.   #endif // AZHUKOV
  97.  
  98.   cin >> n >> m;
  99.   field.resize( n + 2, string(m+2, '.') );
  100.   for(int i=1; i<=n; ++i)
  101.     for(int j=1; j<=m; ++j)
  102.       cin >> field[i][j];
  103.  
  104.   vup.resize( n + 2, vector<bool>(m+2, false) );
  105.   for(int j=0; j<m+2; ++j)
  106.   {
  107.     vup[0][j] = true;
  108.     for(int i=1; i<n+2; ++i)
  109.       if (field[i][j] == '.')
  110.         vup[i][j] = true;
  111.       else if (field[i][j] == 'N')
  112.       {
  113.         vup[i][j] = true;
  114.         out.push({i, j});
  115.         break;
  116.       }
  117.       else
  118.         break;
  119.   }
  120.  
  121.   vdown.resize( n + 2, vector<bool>(m+2, false) );
  122.   for(int j=0; j<m+2; ++j)
  123.   {
  124.     vdown[n+1][j] = true;
  125.     for(int i=n; i>=0; --i)
  126.       if (field[i][j] == '.')
  127.         vdown[i][j] = true;
  128.       else if (field[i][j] == 'S')
  129.       {
  130.         vdown[i][j] = true;
  131.         out.push({i, j});
  132.         break;
  133.       }
  134.       else
  135.         break;
  136.   }
  137.  
  138.   vleft.resize( n + 2, vector<bool>(m+2, false) );
  139.   for(int i=0; i<n+2; ++i)
  140.   {
  141.     vleft[i][0] = true;
  142.     for(int j=1; j<m+2; ++j)
  143.       if (field[i][j] == '.')
  144.         vleft[i][j] = true;
  145.       else if(field[i][j] == 'W')
  146.       {
  147.         vleft[i][j] = true;
  148.         out.push({i, j});
  149.         break;
  150.       }
  151.       else
  152.         break;
  153.   }
  154.  
  155.   vright.resize( n + 2, vector<bool>(m+2, false) );
  156.   for(int i=0; i<n+2; ++i)
  157.   {
  158.     vright[i][m+1] = true;
  159.     for(int j=m; j>=0; --j)
  160.       if (field[i][j] == '.')
  161.         vright[i][j] = true;
  162.       else if(field[i][j] == 'E')
  163.       {
  164.         vright[i][j] = true;
  165.         out.push({i, j});
  166.         break;
  167.       }
  168.       else
  169.         break;
  170.   }
  171. }
  172.  
  173. int main()
  174. {
  175.   read_data();
  176.   solve();
  177.   return 0;
  178. }
Advertisement
Add Comment
Please, Sign In to add comment