Advertisement
Dynonychus

CSES - Monsters

Nov 14th, 2024
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.25 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define int long long
  3.  
  4. using namespace std;
  5.  
  6. const int mn = 1005;
  7.  
  8. int n;
  9. int m;
  10. int i;
  11. int j;
  12. int x;
  13. int y;
  14. int z;
  15. int p;
  16. int q;
  17.  
  18. vector<string> vec(mn);         // Stores Maze
  19. vector<vector<bool>> visM(mn);  // Visited by M
  20. vector<vector<bool>> visA(mn);  // Visited by A
  21. vector<vector<bool>> block(mn); // Stores wall locations
  22. vector<string> dir(mn);         // Stores final path
  23.  
  24. queue<pair<int, int>> qA;
  25. queue<pair<int, int>> qM;
  26.  
  27. signed main() {
  28. ios_base::sync_with_stdio(false);
  29. cin.tie(0);
  30.  
  31. int a=0;
  32. int b=0;
  33. char c;
  34. string s;
  35.  
  36. cin>>n>>m;
  37.  
  38. vec.resize(n);
  39. visA.resize(n);
  40. visM.resize(n);
  41. block.resize(n);
  42. dir.resize(n);
  43.  
  44. for(i=0;i<n;i++) {
  45.     cin>>s;
  46.     vec.at(i) = s;
  47.  
  48.     visA.at(i).resize(m);
  49.     visM.at(i).resize(m);
  50.     block.at(i).resize(m);
  51.     dir.at(i).resize(m);
  52. }
  53.  
  54. for(i=0;i<n;i++) {
  55.     for(j=0;j<m;j++) {
  56.         if(vec.at(i).at(j) == '#')
  57.             block.at(i).at(j) = true;
  58.  
  59.         if(vec.at(i).at(j) == 'M') {
  60.             visM.at(i).at(j) = true;
  61.             qM.push({i, j});
  62.         }
  63.  
  64.         if(vec.at(i).at(j) == 'A') {
  65.             visA.at(i).at(j) = true;
  66.             qA.push({i, j});
  67.  
  68.             p = i;
  69.             q = j;
  70.         }
  71.     }
  72. }
  73.  
  74. while(!qA.empty()) {
  75.     z = qM.size();
  76.  
  77.     if(z == 0)
  78.         goto lol;
  79.  
  80.     while(z--) {
  81.         x = qM.front().first;
  82.         y = qM.front().second;
  83.  
  84.         qM.pop();
  85.  
  86.         visM.at(x).at(y) = true;
  87.  
  88.         a = (x+1);
  89.         b = y;
  90.  
  91.         if(a < n && a >= 0 && b < m && b >= 0 && !block.at(a).at(b) && !visM.at(a).at(b))
  92.         qM.push({a, b});
  93.  
  94.         a = (x-1);
  95.         b = y;
  96.  
  97.         if(a < n && a >= 0 && b < m && b >= 0 && !block.at(a).at(b) && !visM.at(a).at(b))
  98.         qM.push({a, b});
  99.  
  100.         a = x;
  101.         b = (y+1);
  102.  
  103.         if(a < n && a >= 0 && b < m && b >= 0 && !block.at(a).at(b) && !visM.at(a).at(b))
  104.         qM.push({a, b});
  105.  
  106.         a = x;
  107.         b = (y-1);
  108.  
  109.         if(a < n && a >= 0 && b < m && b >= 0 && !block.at(a).at(b) && !visM.at(a).at(b))
  110.         qM.push({a, b});
  111.     }
  112.  
  113.     i=i;
  114.  
  115.     lol:
  116.  
  117.     z = qA.size();
  118.  
  119.     while(z--) {
  120.         x = qA.front().first;
  121.         y = qA.front().second;
  122.  
  123.         qA.pop();
  124.  
  125.         if(visM.at(x).at(y))
  126.             continue;
  127.  
  128.         visA.at(x).at(y) = true;
  129.  
  130.         if(x == 0 || y == 0 || x == (n-1) || y == (m-1))
  131.             goto lol;
  132.  
  133.         a = (x+1);
  134.         b = y;
  135.  
  136.         if(a < n && a >= 0 && b < m && b >= 0 && !block.at(a).at(b) && !visA.at(a).at(b) && !visM.at(a).at(b)) {
  137.             qA.push({a, b});
  138.             dir.at(a).at(b) = 'D';
  139.         }
  140.  
  141.         a = (x-1);
  142.         b = y;
  143.  
  144.         if(a < n && a >= 0 && b < m && b >= 0 && !block.at(a).at(b) && !visA.at(a).at(b) && !visM.at(a).at(b)) {
  145.             qA.push({a, b});
  146.             dir.at(a).at(b) = 'U';
  147.         }
  148.  
  149.         a = x;
  150.         b = (y+1);
  151.  
  152.         if(a < n && a >= 0 && b < m && b >= 0 && !block.at(a).at(b) && !visA.at(a).at(b) && !visM.at(a).at(b)) {
  153.             qA.push({a, b});
  154.             dir.at(a).at(b) = 'R';
  155.         }
  156.  
  157.         a = x;
  158.         b = (y-1);
  159.  
  160.         if(a < n && a >= 0 && b < m && b >= 0 && !block.at(a).at(b) && !visA.at(a).at(b) && !visM.at(a).at(b)) {
  161.             qA.push({a, b});
  162.             dir.at(a).at(b) = 'L';
  163.         }
  164.     }
  165. }
  166.  
  167. a=0;
  168.  
  169. for(j=0;j<m;j++) {
  170.     if(visA.at(0).at(j) || visA.at(n-1).at(j)) {
  171.         a = -1;
  172.  
  173.         if(visA.at(0).at(j))
  174.             x = 0;
  175.  
  176.         else
  177.             x = (n-1);
  178.  
  179.         y = j;
  180.  
  181.         break;
  182.     }
  183. }
  184.  
  185. for(i=0;i<n;i++) {
  186.     if(visA.at(i).at(0) || visA.at(i).at(m-1)) {
  187.         a = -1;
  188.  
  189.         if(visA.at(i).at(0))
  190.             y = 0;
  191.  
  192.         else
  193.             y = (m-1);
  194.  
  195.         x = i;
  196.  
  197.         break;
  198.     }
  199. }
  200.  
  201. if(a == -1) {
  202.     cout<<"YES"<<endl;
  203.  
  204.     a=0;
  205.     s.clear();
  206.  
  207.     while(!(x == p && y == q)) {
  208.         s += dir.at(x).at(y);
  209.  
  210.         if(dir.at(x).at(y) == 'U')
  211.             x++;
  212.  
  213.         else if(dir.at(x).at(y) == 'D')
  214.             x--;
  215.  
  216.         else if(dir.at(x).at(y) == 'R')
  217.             y--;
  218.  
  219.         else
  220.             y++;
  221.  
  222.         a++;
  223.     }
  224.  
  225.     reverse(s.begin(), s.end());
  226.  
  227.     cout<<a<<endl;
  228.     cout<<s<<endl;
  229. }
  230.  
  231. else
  232.     cout<<"NO"<<endl;
  233.  
  234. return 0;
  235. }
  236.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement