Advertisement
akashtadwai

BFS-Path-Finding

Aug 22nd, 2021
1,147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.73 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. #define pb push_back
  5. #define all(x) x.begin(), x.end()
  6. #define ar array
  7. #define ff first
  8. #define ss second
  9. #define PI pair<int, int>
  10. const int inf = 1e9 + 5;
  11.  
  12. vector<vector<char>> grid;
  13. int n, m;
  14. const int mx = 1e3;
  15. int distm[2001][2001], disth[2001][2001];
  16. pair<PI, char> par[2001][2001];
  17. vector<int> xdir{1, 0, -1, 0}, ydir{0, 1, 0, -1};
  18. vector<char> dir{'D', 'R', 'U', 'L'};
  19. PI st, en;
  20.  
  21. void init()
  22. {
  23.     cin >> n >> m;
  24.     grid = vector<vector<char>>(n, vector<char>(m));
  25.     queue<PI> q;
  26.     for (int i = 0; i < n; i++)
  27.     {
  28.         for (int j = 0; j < m; j++)
  29.         {
  30.             cin >> grid[i][j];
  31.             distm[i][j] = inf;
  32.             disth[i][j] = inf;
  33.             if (grid[i][j] == 'M')
  34.             {
  35.                 q.push({i, j});
  36.                 distm[i][j] = 0;
  37.             }
  38.             else if (grid[i][j] == 'A')
  39.             {
  40.                 st = {i, j};
  41.                 grid[i][j]='.';
  42.                 disth[i][j] = 0;
  43.             }
  44.         }
  45.     }
  46.  
  47.     auto isSafe = [&](int x, int y) -> bool
  48.     {
  49.         bool isBorder = (x == 0 or y == 0 or x == n - 1 or y == m - 1);
  50.         bool isStar = grid[x][y] == '.';
  51.         return isBorder && isStar;
  52.     };
  53.  
  54.     auto isvalid = [&](PI X) -> bool
  55.     {
  56.         int i = X.ff, j = X.ss;
  57.         return (i >= 0 and i < n and j >= 0 and j < m and grid[i][j] != '#');
  58.     };
  59.  
  60.     while (!q.empty())
  61.     {
  62.         PI x = q.front();
  63.         q.pop();
  64.         for (int i = 0; i < 4; i++)
  65.         {
  66.             PI X = {x.ff + xdir[i], x.ss + ydir[i]};
  67.             if (!isvalid(X) || distm[X.ff][X.ss] != inf)
  68.                 continue;
  69.             distm[X.ff][X.ss] = distm[x.ff][x.ss] + 1;
  70.             q.push(X);
  71.         }
  72.     }
  73.  
  74.     q = {};
  75.     q.push(st);
  76.     bool ok = false;
  77.     while (!q.empty())
  78.     {
  79.         PI x = q.front();
  80.         q.pop();
  81.         if (isSafe(x.ff, x.ss))
  82.         {
  83.             en = x;
  84.             ok = true;
  85.             break;
  86.         }
  87.         for (int i = 0; i < 4; i++)
  88.         {
  89.             PI X = {x.ff + xdir[i], x.ss + ydir[i]};
  90.             if (!isvalid(X) || disth[X.ff][X.ss]!=inf || distm[X.ff][X.ss] <= disth[x.ff][x.ss]+1)
  91.                 continue;
  92.             disth[X.ff][X.ss] = disth[x.ff][x.ss] + 1;
  93.             par[X.ff][X.ss] = {x, dir[i]};
  94.             q.push(X);
  95.         }
  96.     }
  97.     if (!ok)
  98.     {
  99.         cout << "NO" << endl;
  100.         return;
  101.     }
  102.     string z;
  103.     while (en != st)
  104.     {
  105.         z += par[en.ff][en.ss].ss;
  106.         en = par[en.ff][en.ss].ff;
  107.     }
  108.     cout << "YES\n";
  109.     reverse(all(z));
  110.     cout << z.size() << "\n";
  111.     cout << z;
  112. }
  113. int32_t main()
  114. {
  115.     init();
  116.     return 0;
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement