# CSES .1194 Monsters
[**題目連結**](https://cses.fi/problemset/task/1194/)
```cpp=
//Monsters
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
#include<unordered_map>
#define pii pair<int,int>
using namespace std;
int n, m;
vector<string> maze;
vector<vector<bool>> visited;
vector<vector<char>> dir;
vector<vector<int>> timeA;
vector<vector<int>> timeM;
vector<pii> Exit{};
vector<pii> Monsters{};
pii start;
void bfs(char c)
{
int dx[4] = {0,1,0,-1}, dy[4] = {1,0,-1,0};
char move[4] = {'R','D','L','U'};
visited.assign(n, vector<bool> (m, false));
if(c == 'A')
{
queue<pii> qA;
qA.push(start);
visited[start.first][start.second] = true;
timeA[start.first][start.second] = 0;
while(!qA.empty())
{
pii now = qA.front();
qA.pop();
for(int i = 0 ; i < 4 ; i++)
{
int nx = now.first + dx[i], ny = now.second + dy[i];
if(nx < 0 || ny < 0 || nx >= n || ny >= m ||
visited[nx][ny] || maze[nx][ny] == '#' || timeA[now.first][now.second]+1 >= timeM[nx][ny])
continue;
visited[nx][ny] = true;
timeA[nx][ny] = timeA[now.first][now.second] + 1;
dir[nx][ny] = move[i];
qA.push({nx,ny});
}
}
}
else if(c == 'M')
{
queue<pii> qM;
for(auto [x,y] : Monsters)
{
qM.push({x,y});
visited[x][y] = true;
timeM[x][y] = 0;
}
while(!qM.empty())
{
pii now = qM.front();
qM.pop();
for(int i = 0 ; i < 4 ; i++)
{
int nx = now.first + dx[i], ny = now.second + dy[i];
if(nx < 0 || ny < 0 || nx >= n || ny >= m || visited[nx][ny] || maze[nx][ny] == '#')
continue;
visited[nx][ny] = true;
timeM[nx][ny] = timeM[now.first][now.second] + 1;
qM.push({nx,ny});
}
}
}
}
int main()
{
cin >> n >> m;
maze.assign(n,{});
visited.assign(n, vector<bool> (m, false));
dir.assign(n, vector<char> (m, -1));
timeA.assign(n, vector<int> (m, 1e9));
timeM.assign(n, vector<int> (m, 1e9));
for(int i = 0 ; i < n ; i++)
{
cin >> maze[i];
for(int j = 0 ; j < m ; j++)
{
if((i == 0 || j == 0 || i == n - 1 || j == m - 1) && maze[i][j] == '.')
Exit.push_back({i,j});
if(maze[i][j] == 'A')
start = {i,j};
if(maze[i][j] == 'M')
Monsters.push_back({i,j});
}
}
if(start.first == 0 || start.second == 0 || start.first == n - 1 || start.second == m - 1)
{
cout << "YES\n";
return 0;
}
if(Exit.empty())
{
cout << "NO\n";
return 0;
}
if(!Monsters.empty())
bfs('M');
bfs('A');
bool escape = false;
unordered_map<char,pii> rev = {{'R',{0,-1}},{'L',{0,1}},{'U',{1,0}},{'D',{-1,0}}};
for(auto [endx,endy] : Exit)
{
int nowx = endx, nowy = endy;
if(timeA[nowx][nowy] < timeM[nowx][nowy])
{
string path{""};
while(maze[nowx][nowy] != 'A')
{
char c = dir[nowx][nowy];
path += c;
nowx += rev[c].first;
nowy += rev[c].second;
}
reverse(path.begin(), path.end());
cout << "YES\n" << path.size() << "\n" << path;
return 0;
}
}
cout << "NO\n";
return 0;
}
```