#include <iostream>
#include <queue>
#define MAXN 100
using namespace std;
int monster_level[MAXN][MAXN]; //monster visited time
int human_level[MAXN][MAXN]; //human visited time
int grid[MAXN][MAXN];
int row, col;
// check if it is possible to move to (x, y)
bool isValidMove(int x, int y)
{
if (x < 0 || x >= row || y < 0 || y >= col)
return false;
return true;
}
//check the cell if it is visited by monster before human
bool is_Forbidden(int x, int y)
{
if(monster_level[x][y]<=human_level[x][y]) return true;
return false;
}
//check escape
bool is_escape(int x, int y)
{
if(x==row-1 || y==col-1) return true;
return false;
}
// BFS traversal of the grid
void monster_BFS(int startX, int startY,int row, int col)
{
int x, y;
queue<pair<int, int>> q;
// mark the starting point as visited
q.push({startX, startY});
monster_level[startX][startY]=0;
grid[startX][startY] = -2; //-2 for monster visited
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
while (!q.empty())
{
x = q.front().first;
y = q.front().second;
q.pop();
for (int i = 0; i < 4; i++)
{
int newX = x + dx[i];
int newY = y + dy[i];
if (isValidMove(newX, newY) && grid[newX][newY] != -1 && grid[newX][newY] != -2)
{
q.push({newX, newY});
grid[newX][newY] = -2;
monster_level[newX][newY] = monster_level[x][y] + 1;
}
}
}
}
void human_BFS(int startX, int startY,int row, int col)
{
int x, y;
queue<pair<int, int>> q;
// mark the starting point as visited
q.push({startX, startY});
grid[startX][startY] = 1; //1 for human visited
human_level[startX][startY]=0;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
while (!q.empty())
{
x = q.front().first;
y = q.front().second;
q.pop();
for (int i = 0; i < 4; i++)
{
int newX = x + dx[i];
int newY = y + dy[i];
if(is_escape(newX,newY) && !is_Forbidden(newX,newY))
{
cout<<"YES";
return;
}
if (isValidMove(newX, newY) && grid[newX][newY] != -1 && grid[newX][newY] != 1 && !is_Forbidden(newX, newY))
{
q.push({newX, newY});
human_level[newX][newY]=human_level[x][y]+1;
grid[newX][newY] = 1;
}
}
}
cout<<"NO";
}
int main()
{
/*
5 8
########
#M..A..#
#.#.M#.#
#M#..#..
#.######
*/
vector<pair<int, int>> monsters;
pair<int,int>start;
cin>>row>>col;
for(int r=0; r<row; r++)
{
string s;
cin>>s;
for(int c=0; c<col; c++)
{
if(s[c]=='#')
grid[r][c]=-1;
else if(s[c]=='.')
grid[r][c]=1;
else if(s[c]=='M')
{
grid[r][c]=-2;
pair<int,int>monster=make_pair(r,c);
monsters.push_back(monster);
}
else if(s[c]=='A')
{
grid[r][c]=1;
start=make_pair(r,c);
}
}
}
for (auto par:monsters)
{
monster_BFS(par.first,par.second,row,col);
}
human_BFS(start.first,start.second,row,col);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8cXVldWU+CiNkZWZpbmUgTUFYTiAxMDAKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBtb25zdGVyX2xldmVsW01BWE5dW01BWE5dOyAvL21vbnN0ZXIgdmlzaXRlZCB0aW1lCmludCBodW1hbl9sZXZlbFtNQVhOXVtNQVhOXTsgICAvL2h1bWFuIHZpc2l0ZWQgdGltZQppbnQgZ3JpZFtNQVhOXVtNQVhOXTsKCmludCByb3csIGNvbDsKCi8vIGNoZWNrIGlmIGl0IGlzIHBvc3NpYmxlIHRvIG1vdmUgdG8gKHgsIHkpCmJvb2wgaXNWYWxpZE1vdmUoaW50IHgsIGludCB5KQp7CiAgICBpZiAoeCA8IDAgfHwgeCA+PSByb3cgfHwgeSA8IDAgfHwgeSA+PSBjb2wpCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHRydWU7Cn0KLy9jaGVjayB0aGUgY2VsbCBpZiBpdCBpcyB2aXNpdGVkIGJ5IG1vbnN0ZXIgYmVmb3JlIGh1bWFuCmJvb2wgaXNfRm9yYmlkZGVuKGludCB4LCBpbnQgeSkKewogICAgaWYobW9uc3Rlcl9sZXZlbFt4XVt5XTw9aHVtYW5fbGV2ZWxbeF1beV0pIHJldHVybiB0cnVlOwogICAgcmV0dXJuIGZhbHNlOwp9CgovL2NoZWNrIGVzY2FwZQpib29sIGlzX2VzY2FwZShpbnQgeCwgaW50IHkpCnsKICAgIGlmKHg9PXJvdy0xIHx8IHk9PWNvbC0xKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBmYWxzZTsKfQoKLy8gQkZTIHRyYXZlcnNhbCBvZiB0aGUgZ3JpZAp2b2lkIG1vbnN0ZXJfQkZTKGludCBzdGFydFgsIGludCBzdGFydFksaW50IHJvdywgaW50IGNvbCkKewogICAgaW50IHgsIHk7CiAgICBxdWV1ZTxwYWlyPGludCwgaW50Pj4gcTsKCiAgICAvLyBtYXJrIHRoZSBzdGFydGluZyBwb2ludCBhcyB2aXNpdGVkCiAgICBxLnB1c2goe3N0YXJ0WCwgc3RhcnRZfSk7CiAgICBtb25zdGVyX2xldmVsW3N0YXJ0WF1bc3RhcnRZXT0wOwogICAgZ3JpZFtzdGFydFhdW3N0YXJ0WV0gPSAtMjsgLy8tMiBmb3IgbW9uc3RlciB2aXNpdGVkCgogICAgaW50IGR4W10gPSB7LTEsIDEsIDAsIDB9OwogICAgaW50IGR5W10gPSB7MCwgMCwgLTEsIDF9OwoKICAgIHdoaWxlICghcS5lbXB0eSgpKQogICAgewogICAgICAgIHggPSBxLmZyb250KCkuZmlyc3Q7CiAgICAgICAgeSA9IHEuZnJvbnQoKS5zZWNvbmQ7CiAgICAgICAgcS5wb3AoKTsKCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspCiAgICAgICAgewogICAgICAgICAgICBpbnQgbmV3WCA9IHggKyBkeFtpXTsKICAgICAgICAgICAgaW50IG5ld1kgPSB5ICsgZHlbaV07CgogICAgICAgICAgICBpZiAoaXNWYWxpZE1vdmUobmV3WCwgbmV3WSkgJiYgZ3JpZFtuZXdYXVtuZXdZXSAhPSAtMSAmJiBncmlkW25ld1hdW25ld1ldICE9IC0yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBxLnB1c2goe25ld1gsIG5ld1l9KTsKICAgICAgICAgICAgICAgIGdyaWRbbmV3WF1bbmV3WV0gPSAtMjsKICAgICAgICAgICAgICAgIG1vbnN0ZXJfbGV2ZWxbbmV3WF1bbmV3WV0gPSBtb25zdGVyX2xldmVsW3hdW3ldICsgMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQp2b2lkIGh1bWFuX0JGUyhpbnQgc3RhcnRYLCBpbnQgc3RhcnRZLGludCByb3csIGludCBjb2wpCnsKICAgIGludCB4LCB5OwogICAgcXVldWU8cGFpcjxpbnQsIGludD4+IHE7CgogICAgLy8gbWFyayB0aGUgc3RhcnRpbmcgcG9pbnQgYXMgdmlzaXRlZAogICAgcS5wdXNoKHtzdGFydFgsIHN0YXJ0WX0pOwogICAgZ3JpZFtzdGFydFhdW3N0YXJ0WV0gPSAxOyAvLzEgZm9yIGh1bWFuIHZpc2l0ZWQKICAgIGh1bWFuX2xldmVsW3N0YXJ0WF1bc3RhcnRZXT0wOwogICAgaW50IGR4W10gPSB7LTEsIDEsIDAsIDB9OwogICAgaW50IGR5W10gPSB7MCwgMCwgLTEsIDF9OwoKICAgIHdoaWxlICghcS5lbXB0eSgpKQogICAgewogICAgICAgIHggPSBxLmZyb250KCkuZmlyc3Q7CiAgICAgICAgeSA9IHEuZnJvbnQoKS5zZWNvbmQ7CiAgICAgICAgcS5wb3AoKTsKCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspCiAgICAgICAgewogICAgICAgICAgICBpbnQgbmV3WCA9IHggKyBkeFtpXTsKICAgICAgICAgICAgaW50IG5ld1kgPSB5ICsgZHlbaV07CiAgICAgICAgICAgIGlmKGlzX2VzY2FwZShuZXdYLG5ld1kpICYmICFpc19Gb3JiaWRkZW4obmV3WCxuZXdZKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb3V0PDwiWUVTIjsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoaXNWYWxpZE1vdmUobmV3WCwgbmV3WSkgJiYgZ3JpZFtuZXdYXVtuZXdZXSAhPSAtMSAmJiBncmlkW25ld1hdW25ld1ldICE9IDEgJiYgIWlzX0ZvcmJpZGRlbihuZXdYLCBuZXdZKSkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgIHEucHVzaCh7bmV3WCwgbmV3WX0pOwogICAgICAgICAgICAgICAgaHVtYW5fbGV2ZWxbbmV3WF1bbmV3WV09aHVtYW5fbGV2ZWxbeF1beV0rMTsKICAgICAgICAgICAgICAgIGdyaWRbbmV3WF1bbmV3WV0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgY291dDw8Ik5PIjsKfQppbnQgbWFpbigpCnsKICAgIC8qCjUgOAojIyMjIyMjIwojTS4uQS4uIwojLiMuTSMuIwojTSMuLiMuLgojLiMjIyMjIwogICAgKi8KICAgIHZlY3RvcjxwYWlyPGludCwgaW50Pj4gbW9uc3RlcnM7CiAgICBwYWlyPGludCxpbnQ+c3RhcnQ7CiAgICBjaW4+PnJvdz4+Y29sOwogICAgZm9yKGludCByPTA7IHI8cm93OyByKyspCiAgICB7CiAgICAgICAgc3RyaW5nIHM7CiAgICAgICAgY2luPj5zOwogICAgICAgIGZvcihpbnQgYz0wOyBjPGNvbDsgYysrKQogICAgICAgIHsKICAgICAgICAgICAgaWYoc1tjXT09JyMnKQogICAgICAgICAgICAgICAgZ3JpZFtyXVtjXT0tMTsKICAgICAgICAgICAgZWxzZSBpZihzW2NdPT0nLicpCiAgICAgICAgICAgICAgICBncmlkW3JdW2NdPTE7CiAgICAgICAgICAgIGVsc2UgaWYoc1tjXT09J00nKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBncmlkW3JdW2NdPS0yOwogICAgICAgICAgICAgICAgcGFpcjxpbnQsaW50Pm1vbnN0ZXI9bWFrZV9wYWlyKHIsYyk7CiAgICAgICAgICAgICAgICBtb25zdGVycy5wdXNoX2JhY2sobW9uc3Rlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZihzW2NdPT0nQScpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGdyaWRbcl1bY109MTsKICAgICAgICAgICAgICAgIHN0YXJ0PW1ha2VfcGFpcihyLGMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGZvciAoYXV0byBwYXI6bW9uc3RlcnMpCiAgICB7CiAgICAgICAgbW9uc3Rlcl9CRlMocGFyLmZpcnN0LHBhci5zZWNvbmQscm93LGNvbCk7CiAgICB9CiAgIGh1bWFuX0JGUyhzdGFydC5maXJzdCxzdGFydC5zZWNvbmQscm93LGNvbCk7CiAgICByZXR1cm4gMDsKfQo=