#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define nmax 1001
int n, m;
char a[nmax][nmax];
int monster_dist[nmax][nmax]; // Khoảng cách tối thiểu từ quái vật đến (i, j)
int player_dist[nmax][nmax]; // Khoảng cách từ người chơi đến (i, j)
pair<int, int> parent[nmax][nmax];
char dir[nmax][nmax]; // Hướng di chuyển để đến (i, j)
int dx[4] = {1, 0, 0, -1};
int dy[4] = {0, 1, -1, 0};
char moves[4] = {'D', 'R', 'L', 'U'};
bool is_valid(int x, int y) {
return x >= 1 && x <= n && y >= 1 && y <= m && a[x][y] != '#';
}
void bfs_monsters(vector<pair<int, int>>& monsters) {
queue<pair<int, int>> q;
memset(monster_dist, -1, sizeof(monster_dist));
for (auto [x, y] : monsters) {
q.push({x, y});
monster_dist[x][y] = 0;
}
while (!q.empty()) {
auto [x, y] = q.front(); q.pop();
for (int i = 0; i < 4; i++) {
int nx = x + dx[i], ny = y + dy[i];
if (is_valid(nx, ny) && monster_dist[nx][ny] == -1) {
monster_dist[nx][ny] = monster_dist[x][y] + 1;
q.push({nx, ny});
}
}
}
}
bool bfs_player(int start_x, int start_y) {
queue<pair<int, int>> q;
memset(player_dist, -1, sizeof(player_dist));
q.push({start_x, start_y});
player_dist[start_x][start_y] = 0;
while (!q.empty()) {
auto [x, y] = q.front(); q.pop();
// Kiểm tra nếu đã đến biên
if (x == 1 || x == n || y == 1 || y == m) {
return true;
}
for (int i = 0; i < 4; i++) {
int nx = x + dx[i], ny = y + dy[i];
if (is_valid(nx, ny) && player_dist[nx][ny] == -1) {
// Kiểm tra ô (nx, ny) có an toàn không
if (monster_dist[nx][ny] == -1 || player_dist[x][y] + 1 < monster_dist[nx][ny]) {
player_dist[nx][ny] = player_dist[x][y] + 1;
parent[nx][ny] = {x, y};
dir[nx][ny] = moves[i];
q.push({nx, ny});
}
}
}
}
return false;
}
void solve() {
cin >> n >> m;
vector<pair<int, int>> monsters;
pair<int, int> start;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> a[i][j];
if (a[i][j] == 'M') monsters.push_back({i, j});
if (a[i][j] == 'A') start = {i, j};
}
}
// Nếu A ở biên ngay lúc đầu
if (start.first == 1 || start.first == n || start.second == 1 || start.second == m) {
cout << "YES\n0\n";
return;
}
bfs_monsters(monsters);
if (bfs_player(start.first, start.second)) {
cout << "YES\n";
// Truy vết đường đi
vector<char> path;
int x, y;
// Tìm điểm biên
for (x = 1; x <= n; x++) {
for (y = 1; y <= m; y++) {
if ((x == 1 || x == n || y == 1 || y == m) && player_dist[x][y] != -1) {
goto reconstruct;
}
}
}
reconstruct:
while (x != start.first || y != start.second) {
path.push_back(dir[x][y]);
auto [px, py] = parent[x][y];
x = px; y = py;
}
reverse(path.begin(), path.end());
cout << path.size() << "\n";
for (char c : path) cout << c;
} else {
cout << "NO";
}
}
int main() {
solve();
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgbm1heCAxMDAxCiAKaW50IG4sIG07CmNoYXIgYVtubWF4XVtubWF4XTsKaW50IG1vbnN0ZXJfZGlzdFtubWF4XVtubWF4XTsgIC8vIEtob+G6o25nIGPDoWNoIHThu5FpIHRoaeG7g3UgdOG7qyBxdcOhaSB24bqtdCDEkeG6v24gKGksIGopCmludCBwbGF5ZXJfZGlzdFtubWF4XVtubWF4XTsgICAvLyBLaG/huqNuZyBjw6FjaCB04burIG5nxrDhu51pIGNoxqFpIMSR4bq/biAoaSwgaikKcGFpcjxpbnQsIGludD4gcGFyZW50W25tYXhdW25tYXhdOwpjaGFyIGRpcltubWF4XVtubWF4XTsgICAgICAgICAgLy8gSMaw4bubbmcgZGkgY2h1eeG7g24gxJHhu4MgxJHhur9uIChpLCBqKQogCmludCBkeFs0XSA9IHsxLCAwLCAwLCAtMX07CmludCBkeVs0XSA9IHswLCAxLCAtMSwgMH07CmNoYXIgbW92ZXNbNF0gPSB7J0QnLCAnUicsICdMJywgJ1UnfTsKIApib29sIGlzX3ZhbGlkKGludCB4LCBpbnQgeSkgewogICAgcmV0dXJuIHggPj0gMSAmJiB4IDw9IG4gJiYgeSA+PSAxICYmIHkgPD0gbSAmJiBhW3hdW3ldICE9ICcjJzsKfQogCnZvaWQgYmZzX21vbnN0ZXJzKHZlY3RvcjxwYWlyPGludCwgaW50Pj4mIG1vbnN0ZXJzKSB7CiAgICBxdWV1ZTxwYWlyPGludCwgaW50Pj4gcTsKICAgIG1lbXNldChtb25zdGVyX2Rpc3QsIC0xLCBzaXplb2YobW9uc3Rlcl9kaXN0KSk7CiAgICBmb3IgKGF1dG8gW3gsIHldIDogbW9uc3RlcnMpIHsKICAgICAgICBxLnB1c2goe3gsIHl9KTsKICAgICAgICBtb25zdGVyX2Rpc3RbeF1beV0gPSAwOwogICAgfQogICAgd2hpbGUgKCFxLmVtcHR5KCkpIHsKICAgICAgICBhdXRvIFt4LCB5XSA9IHEuZnJvbnQoKTsgcS5wb3AoKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewogICAgICAgICAgICBpbnQgbnggPSB4ICsgZHhbaV0sIG55ID0geSArIGR5W2ldOwogICAgICAgICAgICBpZiAoaXNfdmFsaWQobngsIG55KSAmJiBtb25zdGVyX2Rpc3RbbnhdW255XSA9PSAtMSkgewogICAgICAgICAgICAgICAgbW9uc3Rlcl9kaXN0W254XVtueV0gPSBtb25zdGVyX2Rpc3RbeF1beV0gKyAxOwogICAgICAgICAgICAgICAgcS5wdXNoKHtueCwgbnl9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQogCmJvb2wgYmZzX3BsYXllcihpbnQgc3RhcnRfeCwgaW50IHN0YXJ0X3kpIHsKICAgIHF1ZXVlPHBhaXI8aW50LCBpbnQ+PiBxOwogICAgbWVtc2V0KHBsYXllcl9kaXN0LCAtMSwgc2l6ZW9mKHBsYXllcl9kaXN0KSk7CiAgICBxLnB1c2goe3N0YXJ0X3gsIHN0YXJ0X3l9KTsKICAgIHBsYXllcl9kaXN0W3N0YXJ0X3hdW3N0YXJ0X3ldID0gMDsKICAgIHdoaWxlICghcS5lbXB0eSgpKSB7CiAgICAgICAgYXV0byBbeCwgeV0gPSBxLmZyb250KCk7IHEucG9wKCk7CiAgICAgICAgLy8gS2nhu4NtIHRyYSBu4bq/dSDEkcOjIMSR4bq/biBiacOqbgogICAgICAgIGlmICh4ID09IDEgfHwgeCA9PSBuIHx8IHkgPT0gMSB8fCB5ID09IG0pIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAgICAgICAgICAgIGludCBueCA9IHggKyBkeFtpXSwgbnkgPSB5ICsgZHlbaV07CiAgICAgICAgICAgIGlmIChpc192YWxpZChueCwgbnkpICYmIHBsYXllcl9kaXN0W254XVtueV0gPT0gLTEpIHsKICAgICAgICAgICAgICAgIC8vIEtp4buDbSB0cmEgw7QgKG54LCBueSkgY8OzIGFuIHRvw6BuIGtow7RuZwogICAgICAgICAgICAgICAgaWYgKG1vbnN0ZXJfZGlzdFtueF1bbnldID09IC0xIHx8IHBsYXllcl9kaXN0W3hdW3ldICsgMSA8IG1vbnN0ZXJfZGlzdFtueF1bbnldKSB7CiAgICAgICAgICAgICAgICAgICAgcGxheWVyX2Rpc3RbbnhdW255XSA9IHBsYXllcl9kaXN0W3hdW3ldICsgMTsKICAgICAgICAgICAgICAgICAgICBwYXJlbnRbbnhdW255XSA9IHt4LCB5fTsKICAgICAgICAgICAgICAgICAgICBkaXJbbnhdW255XSA9IG1vdmVzW2ldOwogICAgICAgICAgICAgICAgICAgIHEucHVzaCh7bngsIG55fSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7Cn0KIAp2b2lkIHNvbHZlKCkgewogICAgY2luID4+IG4gPj4gbTsKICAgIHZlY3RvcjxwYWlyPGludCwgaW50Pj4gbW9uc3RlcnM7CiAgICBwYWlyPGludCwgaW50PiBzdGFydDsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewogICAgICAgIGZvciAoaW50IGogPSAxOyBqIDw9IG07IGorKykgewogICAgICAgICAgICBjaW4gPj4gYVtpXVtqXTsKICAgICAgICAgICAgaWYgKGFbaV1bal0gPT0gJ00nKSBtb25zdGVycy5wdXNoX2JhY2soe2ksIGp9KTsKICAgICAgICAgICAgaWYgKGFbaV1bal0gPT0gJ0EnKSBzdGFydCA9IHtpLCBqfTsKICAgICAgICB9CiAgICB9CiAgICAvLyBO4bq/dSBBIOG7nyBiacOqbiBuZ2F5IGzDumMgxJHhuqd1CiAgICBpZiAoc3RhcnQuZmlyc3QgPT0gMSB8fCBzdGFydC5maXJzdCA9PSBuIHx8IHN0YXJ0LnNlY29uZCA9PSAxIHx8IHN0YXJ0LnNlY29uZCA9PSBtKSB7CiAgICAgICAgY291dCA8PCAiWUVTXG4wXG4iOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGJmc19tb25zdGVycyhtb25zdGVycyk7CiAgICBpZiAoYmZzX3BsYXllcihzdGFydC5maXJzdCwgc3RhcnQuc2Vjb25kKSkgewogICAgICAgIGNvdXQgPDwgIllFU1xuIjsKICAgICAgICAvLyBUcnV5IHbhur90IMSRxrDhu51uZyDEkWkKICAgICAgICB2ZWN0b3I8Y2hhcj4gcGF0aDsKICAgICAgICBpbnQgeCwgeTsKICAgICAgICAvLyBUw6xtIMSRaeG7g20gYmnDqm4KICAgICAgICBmb3IgKHggPSAxOyB4IDw9IG47IHgrKykgewogICAgICAgICAgICBmb3IgKHkgPSAxOyB5IDw9IG07IHkrKykgewogICAgICAgICAgICAgICAgaWYgKCh4ID09IDEgfHwgeCA9PSBuIHx8IHkgPT0gMSB8fCB5ID09IG0pICYmIHBsYXllcl9kaXN0W3hdW3ldICE9IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgZ290byByZWNvbnN0cnVjdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZWNvbnN0cnVjdDoKICAgICAgICB3aGlsZSAoeCAhPSBzdGFydC5maXJzdCB8fCB5ICE9IHN0YXJ0LnNlY29uZCkgewogICAgICAgICAgICBwYXRoLnB1c2hfYmFjayhkaXJbeF1beV0pOwogICAgICAgICAgICBhdXRvIFtweCwgcHldID0gcGFyZW50W3hdW3ldOwogICAgICAgICAgICB4ID0gcHg7IHkgPSBweTsKICAgICAgICB9CiAgICAgICAgcmV2ZXJzZShwYXRoLmJlZ2luKCksIHBhdGguZW5kKCkpOwogICAgICAgIGNvdXQgPDwgcGF0aC5zaXplKCkgPDwgIlxuIjsKICAgICAgICBmb3IgKGNoYXIgYyA6IHBhdGgpIGNvdXQgPDwgYzsKICAgIH0gZWxzZSB7CiAgICAgICAgY291dCA8PCAiTk8iOwogICAgfQp9CiAKaW50IG1haW4oKSB7CiAgICBzb2x2ZSgpOwogICAgcmV0dXJuIDA7Cn0=