Link to this code:
https://cses.fi/paste/c5e33222088e2eb0da1d14//* 777 */
#include <bits/stdc++.h>
using namespace std;
struct Node {
int r;
int c;
int i;
Node(int rr, int cc, int ii) : r(rr), c(cc), i(ii) {};
};
// up, down, left, right
char dirp[4] = {'U', 'D', 'L', 'R'};
int dirr[4] = {-1, 1, 0, 0};
int dirc[4] = {0, 0, -1, 1};
const int MAX_N = 1005, D = 4;
int R, C, SR, SC, DR, DC;
bool vis[MAX_N][MAX_N];
Node *par[MAX_N][MAX_N];
int bfs(int sr, int sc) {
queue<pair<int, int>> q;
q.emplace(sr, sc);
vis[sr][sc] = 1;
int lvl = 0;
while (!q.empty()) {
int n = q.size();
while (n--) {
auto [r, c] = q.front();
q.pop();
if (r == DR && c == DC) return lvl;
for (int i = 0; i < D; ++i) {
int nr = r + dirr[i], nc = c + dirc[i];
if (vis[nr][nc]) continue;
vis[nr][nc] = 1;
q.emplace(nr, nc);
par[nr][nc] = new Node(r, c, i);
}
}
lvl++;
}
return -1;
}
string get_path(int sr, int sc, int dr, int dc) {
string path;
for (int r = sr, c = sc; r != dr || c != dc;) {
Node *nxt = par[r][c];
r = nxt->r;
c = nxt->c;
path.push_back(dirp[nxt->i]);
}
reverse(path.begin(), path.end());
return path;
}
void solve() {
cin >> R >> C;
for (int r = 1; r <= R; ++r) {
for (int c = 1; c <= C; ++c) {
char x;
cin >> x;
vis[r][c] = x == '#';
if (x == 'A') {
SR = r;
SC = c;
} else if (x == 'B') {
DR = r;
DC = c;
}
}
}
for (int r = 0; r <= R + 1; ++r) vis[r][0] = vis[r][C + 1] = 1;
for (int c = 0; c <= C + 1; ++c) vis[0][c] = vis[R + 1][c] = 1;
int ans = bfs(SR, SC);
if (ans < 0)
cout << "NO";
else {
string path = get_path(DR, DC, SR, SC);
cout << "YES\n" << ans << "\n" << path;
}
}
int32_t main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
solve();
return 0;
}