Link to this code:
https://cses.fi/paste/682edf0af4184b9cef63b5/#include <algorithm>
#include <iostream>
#include <queue>
#include <string>
#include <utility>
#include <vector>
#define test(x) cerr << "Line(" << __LINE__ << ") " #x << ' ' << x << endl
using namespace std;
using ll = long long;
typedef pair<int, int> pii;
const int di[4] = {-1, 1, 0, 0};
const int dj[4] = {0, 0, -1, 1};
const string directions = "UDLR";
const int inf = 1e9;
void solve() {
int N, M;
cin >> N >> M;
vector<vector<bool>> visited(N + 2, vector<bool>(M + 2, 1));
vector<vector<int>> distance(N + 2, vector<int> (M + 2, inf));
vector<vector<int>> direction(N + 2, vector<int> (M + 2));
int ai, aj, bi, bj;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
char c;
cin >> c;
if (c == '.') {
visited[i][j] = 0;
}
if (c == 'A') {
ai = i;
aj = j;
visited[i][j] = 0;
}
if (c == 'B') {
bi = i;
bj = j;
visited[i][j] = 0;
}
}
}
priority_queue<pair<int, pii>, vector<pair<int, pii>>, greater<pair<int, pii>>> pq;
pq.push({0, {ai, aj}});
distance[ai][aj] = 0;
while (!pq.empty()) {
const auto [_, pos] = pq.top();
const auto [i, j] = pos;
pq.pop();
if (visited[i][j])
continue;
visited[i][j] = 1;
if (i == bi and j == bj) {
cout << "YES\n";
cout << distance[i][j] << '\n';
string path = "";
int cur_i = i, cur_j = j;
while (cur_i != ai or cur_j != aj) {
int dir = direction[cur_i][cur_j];
path += directions[dir];
cur_i -= di[dir];
cur_j -= dj[dir];
}
reverse(path.begin(), path.end());
cout << path << '\n';
return;
}
for (int k = 0; k < 4; k++) {
int ni = i + di[k], nj = j + dj[k];
if (!visited[ni][nj] and
distance[i][j] + 1 < distance[ni][nj]) {
distance[ni][nj] = distance[i][j] + 1;
direction[ni][nj] = k;
pq.push({distance[ni][nj],{ni, nj}});
}
}
}
cout << "NO\n";
}
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
solve();
return 0;
}