Advertisement
newb_ie

CSES - Labyrinth

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