Advertisement
newb_ie

CSES - Monsters

Mar 9th, 2021
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.31 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int maxN = 1010;
  5. char grid[maxN][maxN];
  6. pair<int,int> parent[maxN][maxN];
  7. vector<pair<int,int>> monsters;
  8. int dx[8]= {1,0,-1,0,-1,-1,1,1};
  9. int dy[8]= {0,1,0,-1,-1,1,-1,1};
  10. char direction[4] = {'D','R','U','L'};
  11. int cost_monsters[maxN][maxN],cost_player[maxN][maxN];
  12. int end_x = -1,end_y = -1;
  13.  
  14. void BFS_Monsters (int n,int m) {
  15.     for (int i = 1; i <= n; ++i) {
  16.         for (int j = 1; j <= m; ++j) {
  17.             cost_monsters[i][j] = -1;
  18.         }
  19.     }
  20.     queue<pair<int,int>> q;
  21.     for (int i = 0; i < (int) monsters.size(); ++i) {
  22.         cost_monsters[monsters[i].first][monsters[i].second] = 0;
  23.         q.push(monsters[i]);
  24.     }
  25.     while (!q.empty()) {
  26.         int x = q.front().first, y = q.front().second;
  27.         q.pop();
  28.         for (int i = 0; i < 4; ++i) {
  29.             int xu = x + dx[i],xv = y + dy[i];
  30.             if (xu >= 1 and xu <= n and xv >= 1 and xv <= m and grid[xu][xv] != '#' and cost_monsters[xu][xv] == -1) {
  31.                 cost_monsters[xu][xv] = cost_monsters[x][y] + 1;
  32.                 q.push(make_pair(xu,xv));
  33.             }
  34.         }
  35.     }
  36. }
  37.  
  38. bool BFS_Player(int start_x,int start_y,int n,int m) {
  39.     for (int i = 1; i <= n; ++i) {
  40.         for (int j = 1; j <= m; ++j) {
  41.             cost_player[i][j] = -1;
  42.         }
  43.     }
  44.     cost_player[start_x][start_y] = 0;
  45.     queue<pair<int,int>> q;
  46.     q.push(make_pair(start_x,start_y));
  47.     parent[start_x][start_y] = make_pair(-1,-1);
  48.     while (!q.empty()) {
  49.         int x = q.front().first, y = q.front().second;
  50.         q.pop();
  51.         for (int i = 0; i < 4; ++i) {
  52.             int xu = x + dx[i], xv = y + dy[i];
  53.             if (xu >= 1 and xu <= n and xv >= 1 and xv <= m and cost_player[xu][xv] == -1 and grid[xu][xv] == '.' and (cost_player[x][y] + 1 < cost_monsters[xu][xv] or cost_monsters[xu][xv] == -1)) {
  54.                 cost_player[xu][xv] = cost_player[x][y] + 1;
  55.                 q.push(make_pair(xu,xv));
  56.                 parent[xu][xv] = make_pair(x,y);
  57.                 if (xu == 1 or xu == n or xv == 1 or xv == m) {
  58.                     end_x = xu,end_y = xv;
  59.                     return true;
  60.                 }
  61.             }
  62.         }
  63.     }
  64.     return false;
  65. }
  66.  
  67. int main () {
  68.      ios::sync_with_stdio(false);
  69.      cin.tie(nullptr);
  70.      cout.tie(nullptr);
  71.      int T = 1;
  72.      //~ cin >> T;
  73.      for (int test_case = 1; test_case <= T; ++test_case) {
  74.          int n,m;
  75.          cin >> n >> m;
  76.          int start_x = -1, start_y = -1;
  77.          for (int i = 1; i <= n; ++i) {
  78.              for (int j = 1; j <= m; ++j) {
  79.                  cin >> grid[i][j];
  80.                  if (grid[i][j] == 'A') {
  81.                      start_x = i,start_y = j;
  82.                  }
  83.                  if (grid[i][j] == 'M') {
  84.                      monsters.push_back(make_pair(i,j));
  85.                  }
  86.              }
  87.          }
  88.          BFS_Monsters(n,m);
  89.          if (!BFS_Player(start_x,start_y,n,m)) {
  90.              if (start_x == 1 or start_x == n or start_y == 1 or start_y == m) {
  91.                  cout << "YES\n" << 0 << '\n';
  92.                  return 0;
  93.              }
  94.              cout << "NO\n";
  95.              return 0;
  96.          }
  97.          pair<int,int> res = make_pair(end_x,end_y);
  98.          string ans = "";
  99.          vector<pair<int,int>> path;
  100.          while (res != make_pair(-1,-1)) {
  101.              path.push_back(res);
  102.              res = parent[res.first][res.second];
  103.          }
  104.          reverse(path.begin(),path.end());
  105.          for (int i = 0; i < (int) path.size(); ++i) {
  106.              for (int j = 0; j < 4; ++j) {
  107.                  if (path[i] == make_pair(start_x + dx[j],start_y + dy[j])) {
  108.                      ans += direction[j];
  109.                      start_x = path[i].first;
  110.                      start_y = path[i].second;
  111.                  }
  112.              }
  113.          }
  114.          cout << "YES\n" << (int) ans.size() << '\n' << ans << '\n';
  115.      }
  116.      //cerr << "Time elapsed :" << clock() * 1000.0 / CLOCKS_PER_SEC << " ms" << '\n';
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement