1 #include <iostream>
2 #include <cstdio>
3 #include <cmath>
4 #include <cstring>
5 #include <algorithm>
6 #include <queue>
7 using namespace std;
8 struct node
9 {
10 int x,y,step;
11 }s1,s2;
12 int n,m,dir[4][2]={-1,0,1,0,0,1,0,-1},mi,vis[220][220];
13 int dis[2][220][220];
14 char a[220][220];
15 void bfs(int s,int sx,int sy)
16 {
17 node temp,next;
18 queue<node>q;
19 if(s==0)
20 q.push(s1);
21 else
22 q.push(s2);
23 while(!q.empty())
24 {
25 temp=q.front();q.pop();
26 if(a[temp.x][temp.y]=='@')
27 {
28 dis[s][temp.x][temp.y]=temp.step;
29 vis[temp.x][temp.y]=1;
30 }
31 for(int i=0;i<4;i++)
32 {
33 next.x=temp.x+dir[i][0];
34 next.y=temp.y+dir[i][1];
35 next.step=temp.step+11;
36 if(next.x>=0&&next.y>=0&&next.x<n&&next.y<m&&(a[next.x][next.y]=='.'||a[next.x][next.y]=='@')&&vis[next.x][next.y]==0)
37 {
38 q.push(next);
39 vis[next.x][next.y]=1;
40 }
41 }
42 }
43 }
44 int main(int argc, char *argv[])
45 {
46 while(scanf("%d%d",&n,&m)!=EOF)
47 {
48 for(int i=0;i<n;i++)
49 scanf("%s",a[i]);
50 mi=9999;
51 memset(dis,0,sizeof(dis));
52 for(int i=0;i<n;i++)
53 {
54 for(int j=0;j<m;j++)
55 {
56 if(a[i][j]=='Y')
57 {
58 s1.x=i;
59 s1.y=j;
60 s1.step=0;
61 memset(vis,0,sizeof(vis));
62 bfs(0,i,j);
63 }
64 if(a[i][j]=='M')
65 {
66 s2.x=i;
67 s2.y=j;
68 s2.step=0;
69 memset(vis,0,sizeof(vis));
70 bfs(1,i,j);
71 }
72 }
73 }
74 for(int i=0;i<n;i++)
75 {
76 for(int j=0;j<m;j++)
77 {
78 if(a[i][j]=='@')
79 {
80 if(dis[0][i][j]!=0&&dis[1][i][j]!=0)
81 {
82 mi=min(mi,dis[0][i][j]+dis[1][i][j]);
83 }
84
85 }
86 }
87 }
88 printf("%d\n",mi);
89 }
90 return 0;
91 }