二次bfs 然后将俩矩阵加起来 枚举每个点
O(n^2)
```
#include <bits/stdc++.h>
using namespace std;
const int N = 210;
const int mod =100003;
#define endl '\n'
#define Endl '\n'
#define inf 1e18
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
int n,m,d1[N][N],d2[N][N],dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
char g[N][N];
void bfs1(int x1,int y1){
memset(d1,0x3f,sizeof d1);
queue<pair<int,int>>q;
q.push({x1,y1});
d1[x1][y1]=0;
while(q.size()){
auto [x,y]=q.front();
q.pop();
for(int i=0;i<4;i++){
int a=x+dx[i],b=y+dy[i];
if(a>=0&&a<=n-1&&b>=0&&b<=m-1&&g[a][b]!='#'&&d1[a][b]==0x3f3f3f3f){
d1[a][b]=d1[x][y]+1;
q.push({a,b});
}
}
}
}
void bfs2(int x1,int y1){
memset(d2,0x3f,sizeof d2);
queue<pair<int,int>>q;
q.push({x1,y1});
d2[x1][y1]=0;
while(q.size()){
auto [x,y]=q.front();
q.pop();
for(int i=0;i<4;i++){
int a=x+dx[i],b=y+dy[i];
if(a>=0&&a<=n-1&&b>=0&&b<=m-1&&g[a][b]!='#'&&d2[a][b]==0x3f3f3f3f){
d2[a][b]=d2[x][y]+1;
q.push({a,b});
}
}
}
}
signed main(){
fast
while(cin>>n>>m){
int x1,y1,x2,y2;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>g[i][j];
if(g[i][j]=='Y')x1=i,y1=j;
if(g[i][j]=='M')x2=i,y2=j;
}
}
bfs1(x1,y1);
bfs2(x2,y2);
int ans=2e9;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
d1[i][j]+=d2[i][j];
if(g[i][j]=='@')ans=min(ans,d1[i][j]);
}
}
cout<<ans*11<<endl;
}
return 0^0;
}
```