CSES - Shared codeLink to this code: https://cses.fi/paste/12f26954efdf021166265a/
#include<bits/stdc++.h>
using namespace std;
class Path{
int n,m;
vector<vector<char>>labyrinth;
vector<vector<int>>vis;
int X[4]={-1,0,1,0};
int Y[4]={0,1,0,-1};
string direction="URDL";
public:
Path(int n,int m,vector<vector<char>>labyrinth){
this->n=n;
this->m=m;
this->labyrinth=labyrinth;
vis.resize(n,vector<int>(m,-1));
}
bool isValid(int i,int j){
return (i>=0 and i<n and j>=0 and j<m and labyrinth[i][j]!='#' and vis[i][j]==-1);
}
string ValidPathExist(int i,int j){
queue<pair<int,int>>que;
que.push({i,j});
int x,y,prev;
string path;
int Bx=-1,By=-1;
vis[i][j]=-1;
while(!que.empty()){
x=que.front().first;
y=que.front().second;
que.pop();
if(labyrinth[x][y]=='B'){
Bx=x;
By=y;
break;
}
for(int i=0;i<4;i++){
if(isValid(x+X[i],y+Y[i])){
vis[x+X[i]][y+Y[i]]=i;
que.push({x+X[i],y+Y[i]});
}
}
}
if(Bx==-1)return "";
while(Bx!=i or By!=j){
prev=vis[Bx][By];
path+=direction[prev];
Bx-=X[prev];
By-=Y[prev];
}
reverse(path.begin(),path.end());
return path;
}
};
int main() {
int n,m,startX,startY;
cin>>n>>m;
vector<vector<char>>labyrinth(n,vector<char>(m));
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>labyrinth[i][j];
if(labyrinth[i][j]=='A'){
startX=i;
startY=j;
}
}
}
Path p(n,m,labyrinth);
string path=p.ValidPathExist(startX,startY);
if(path!=""){
cout<<"YES\n"<<path.size()<<endl<<path<<endl;
}else{
cout<<"NO\n";
}
}