#include <iostream>
#include <vector>
#include <queue>
#include <string>
#include <algorithm>
using namespace std;
int n, m;
vector<string> grid;
vector<vector<int>> distM, distA;
vector<vector<pair<int, int>>> parent;
vector<vector<char>> dir;
// Direction arrays for Up, Down, Left, Right
int dr[] = {-1, 1, 0, 0};
int dc[] = {0, 0, -1, 1};
char move_dir[] = {'U', 'D', 'L', 'R'};
// Function to check if a cell is valid to move into
bool isValid(int r, int c) {
return (r >= 0 && r < n && c >= 0 && c < m && grid[r][c] != '#');
}
int main() {
// Optimize input/output operations
ios_base::sync_with_stdio(false);
cin.tie(NULL);
if (!(cin >> n >> m)) return 0;
grid.resize(n);
distM.assign(n, vector<int>(m, 1e9)); // Initialize with a large number (infinity)
distA.assign(n, vector<int>(m, 1e9));
parent.assign(n, vector<pair<int, int>>(m, {-1, -1}));
dir.assign(n, vector<char>(m, ' '));
queue<pair<int, int>> qM, qA;
pair<int, int> startA;
// Read the grid and find the starting positions of the player and all monsters
for (int i = 0; i < n; i++) {
cin >> grid[i];
for (int j = 0; j < m; j++) {
if (grid[i][j] == 'M') {
qM.push({i, j});
distM[i][j] = 0;
} else if (grid[i][j] == 'A') {
startA = {i, j};
qA.push({i, j});
distA[i][j] = 0;
}
}
}
// Step 1: Multi-source BFS for all monsters
while (!qM.empty()) {
auto [r, c] = qM.front();
qM.pop();
for (int i = 0; i < 4; i++) {
int nr = r + dr[i];
int nc = c + dc[i];
// If the cell is valid and hasn't been visited by a monster yet
if (isValid(nr, nc) && distM[nr][nc] == 1e9) {
distM[nr][nc] = distM[r][c] + 1;
qM.push({nr, nc});
}
}
}
// Step 2: BFS for the Player 'A'
bool possible = false;
pair<int, int> end_pos = {-1, -1};
while (!qA.empty()) {
auto [r, c] = qA.front();
qA.pop();
// If 'A' has reached the boundary of the grid safely
if (r == 0 || r == n - 1 || c == 0 || c == m - 1) {
possible = true;
end_pos = {r, c};
break;
}
for (int i = 0; i < 4; i++) {
int nr = r + dr[i];
int nc = c + dc[i];
if (isValid(nr, nc) && distA[nr][nc] == 1e9) {
// 'A' can only step here if they get there faster than any monster
if (distA[r][c] + 1 < distM[nr][nc]) {
distA[nr][nc] = distA[r][c] + 1;
parent[nr][nc] = {r, c}; // Track where we came from
dir[nr][nc] = move_dir[i]; // Track what move we made to get here
qA.push({nr, nc});
}
}
}
}
// Step 3: Print result and reconstruct the path
if (possible) {
cout << "YES\n";
string path = "";
int r = end_pos.first;
int c = end_pos.second;
// Backtrack from the exit to the start point
while (r != startA.first || c != startA.second) {
path += dir[r][c];
auto p = parent[r][c];
r = p.first;
c = p.second;
}
// Reverse the path since we built it backwards
reverse(path.begin(), path.end());
cout << path.length() << "\n";
cout << path << "\n";
} else {
cout << "NO\n";
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxhbGdvcml0aG0+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IG4sIG07CnZlY3RvcjxzdHJpbmc+IGdyaWQ7CnZlY3Rvcjx2ZWN0b3I8aW50Pj4gZGlzdE0sIGRpc3RBOwp2ZWN0b3I8dmVjdG9yPHBhaXI8aW50LCBpbnQ+Pj4gcGFyZW50Owp2ZWN0b3I8dmVjdG9yPGNoYXI+PiBkaXI7CgovLyBEaXJlY3Rpb24gYXJyYXlzIGZvciBVcCwgRG93biwgTGVmdCwgUmlnaHQKaW50IGRyW10gPSB7LTEsIDEsIDAsIDB9OwppbnQgZGNbXSA9IHswLCAwLCAtMSwgMX07CmNoYXIgbW92ZV9kaXJbXSA9IHsnVScsICdEJywgJ0wnLCAnUid9OwoKLy8gRnVuY3Rpb24gdG8gY2hlY2sgaWYgYSBjZWxsIGlzIHZhbGlkIHRvIG1vdmUgaW50bwpib29sIGlzVmFsaWQoaW50IHIsIGludCBjKSB7CiAgICByZXR1cm4gKHIgPj0gMCAmJiByIDwgbiAmJiBjID49IDAgJiYgYyA8IG0gJiYgZ3JpZFtyXVtjXSAhPSAnIycpOwp9CgppbnQgbWFpbigpIHsKICAgIC8vIE9wdGltaXplIGlucHV0L291dHB1dCBvcGVyYXRpb25zCiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUoTlVMTCk7CgogICAgaWYgKCEoY2luID4+IG4gPj4gbSkpIHJldHVybiAwOwoKICAgIGdyaWQucmVzaXplKG4pOwogICAgZGlzdE0uYXNzaWduKG4sIHZlY3RvcjxpbnQ+KG0sIDFlOSkpOyAvLyBJbml0aWFsaXplIHdpdGggYSBsYXJnZSBudW1iZXIgKGluZmluaXR5KQogICAgZGlzdEEuYXNzaWduKG4sIHZlY3RvcjxpbnQ+KG0sIDFlOSkpOwogICAgcGFyZW50LmFzc2lnbihuLCB2ZWN0b3I8cGFpcjxpbnQsIGludD4+KG0sIHstMSwgLTF9KSk7CiAgICBkaXIuYXNzaWduKG4sIHZlY3RvcjxjaGFyPihtLCAnICcpKTsKCiAgICBxdWV1ZTxwYWlyPGludCwgaW50Pj4gcU0sIHFBOwogICAgcGFpcjxpbnQsIGludD4gc3RhcnRBOwoKICAgIC8vIFJlYWQgdGhlIGdyaWQgYW5kIGZpbmQgdGhlIHN0YXJ0aW5nIHBvc2l0aW9ucyBvZiB0aGUgcGxheWVyIGFuZCBhbGwgbW9uc3RlcnMKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgY2luID4+IGdyaWRbaV07CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtOyBqKyspIHsKICAgICAgICAgICAgaWYgKGdyaWRbaV1bal0gPT0gJ00nKSB7CiAgICAgICAgICAgICAgICBxTS5wdXNoKHtpLCBqfSk7CiAgICAgICAgICAgICAgICBkaXN0TVtpXVtqXSA9IDA7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZ3JpZFtpXVtqXSA9PSAnQScpIHsKICAgICAgICAgICAgICAgIHN0YXJ0QSA9IHtpLCBqfTsKICAgICAgICAgICAgICAgIHFBLnB1c2goe2ksIGp9KTsKICAgICAgICAgICAgICAgIGRpc3RBW2ldW2pdID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvLyBTdGVwIDE6IE11bHRpLXNvdXJjZSBCRlMgZm9yIGFsbCBtb25zdGVycwogICAgd2hpbGUgKCFxTS5lbXB0eSgpKSB7CiAgICAgICAgYXV0byBbciwgY10gPSBxTS5mcm9udCgpOwogICAgICAgIHFNLnBvcCgpOwoKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewogICAgICAgICAgICBpbnQgbnIgPSByICsgZHJbaV07CiAgICAgICAgICAgIGludCBuYyA9IGMgKyBkY1tpXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIElmIHRoZSBjZWxsIGlzIHZhbGlkIGFuZCBoYXNuJ3QgYmVlbiB2aXNpdGVkIGJ5IGEgbW9uc3RlciB5ZXQKICAgICAgICAgICAgaWYgKGlzVmFsaWQobnIsIG5jKSAmJiBkaXN0TVtucl1bbmNdID09IDFlOSkgewogICAgICAgICAgICAgICAgZGlzdE1bbnJdW25jXSA9IGRpc3RNW3JdW2NdICsgMTsKICAgICAgICAgICAgICAgIHFNLnB1c2goe25yLCBuY30pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8vIFN0ZXAgMjogQkZTIGZvciB0aGUgUGxheWVyICdBJwogICAgYm9vbCBwb3NzaWJsZSA9IGZhbHNlOwogICAgcGFpcjxpbnQsIGludD4gZW5kX3BvcyA9IHstMSwgLTF9OwoKICAgIHdoaWxlICghcUEuZW1wdHkoKSkgewogICAgICAgIGF1dG8gW3IsIGNdID0gcUEuZnJvbnQoKTsKICAgICAgICBxQS5wb3AoKTsKCiAgICAgICAgLy8gSWYgJ0EnIGhhcyByZWFjaGVkIHRoZSBib3VuZGFyeSBvZiB0aGUgZ3JpZCBzYWZlbHkKICAgICAgICBpZiAociA9PSAwIHx8IHIgPT0gbiAtIDEgfHwgYyA9PSAwIHx8IGMgPT0gbSAtIDEpIHsKICAgICAgICAgICAgcG9zc2libGUgPSB0cnVlOwogICAgICAgICAgICBlbmRfcG9zID0ge3IsIGN9OwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAgICAgICAgICAgIGludCBuciA9IHIgKyBkcltpXTsKICAgICAgICAgICAgaW50IG5jID0gYyArIGRjW2ldOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKGlzVmFsaWQobnIsIG5jKSAmJiBkaXN0QVtucl1bbmNdID09IDFlOSkgewogICAgICAgICAgICAgICAgLy8gJ0EnIGNhbiBvbmx5IHN0ZXAgaGVyZSBpZiB0aGV5IGdldCB0aGVyZSBmYXN0ZXIgdGhhbiBhbnkgbW9uc3RlcgogICAgICAgICAgICAgICAgaWYgKGRpc3RBW3JdW2NdICsgMSA8IGRpc3RNW25yXVtuY10pIHsKICAgICAgICAgICAgICAgICAgICBkaXN0QVtucl1bbmNdID0gZGlzdEFbcl1bY10gKyAxOwogICAgICAgICAgICAgICAgICAgIHBhcmVudFtucl1bbmNdID0ge3IsIGN9OyAgICAvLyBUcmFjayB3aGVyZSB3ZSBjYW1lIGZyb20KICAgICAgICAgICAgICAgICAgICBkaXJbbnJdW25jXSA9IG1vdmVfZGlyW2ldOyAgLy8gVHJhY2sgd2hhdCBtb3ZlIHdlIG1hZGUgdG8gZ2V0IGhlcmUKICAgICAgICAgICAgICAgICAgICBxQS5wdXNoKHtuciwgbmN9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvLyBTdGVwIDM6IFByaW50IHJlc3VsdCBhbmQgcmVjb25zdHJ1Y3QgdGhlIHBhdGgKICAgIGlmIChwb3NzaWJsZSkgewogICAgICAgIGNvdXQgPDwgIllFU1xuIjsKICAgICAgICBzdHJpbmcgcGF0aCA9ICIiOwogICAgICAgIGludCByID0gZW5kX3Bvcy5maXJzdDsKICAgICAgICBpbnQgYyA9IGVuZF9wb3Muc2Vjb25kOwoKICAgICAgICAvLyBCYWNrdHJhY2sgZnJvbSB0aGUgZXhpdCB0byB0aGUgc3RhcnQgcG9pbnQKICAgICAgICB3aGlsZSAociAhPSBzdGFydEEuZmlyc3QgfHwgYyAhPSBzdGFydEEuc2Vjb25kKSB7CiAgICAgICAgICAgIHBhdGggKz0gZGlyW3JdW2NdOwogICAgICAgICAgICBhdXRvIHAgPSBwYXJlbnRbcl1bY107CiAgICAgICAgICAgIHIgPSBwLmZpcnN0OwogICAgICAgICAgICBjID0gcC5zZWNvbmQ7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIFJldmVyc2UgdGhlIHBhdGggc2luY2Ugd2UgYnVpbHQgaXQgYmFja3dhcmRzCiAgICAgICAgcmV2ZXJzZShwYXRoLmJlZ2luKCksIHBhdGguZW5kKCkpOwogICAgICAgIGNvdXQgPDwgcGF0aC5sZW5ndGgoKSA8PCAiXG4iOwogICAgICAgIGNvdXQgPDwgcGF0aCA8PCAiXG4iOwogICAgfSBlbHNlIHsKICAgICAgICBjb3V0IDw8ICJOT1xuIjsKICAgIH0KCiAgICByZXR1cm4gMDsKfQ==