1 #include<stdio.h>
2 #include<string.h>
3 #include<algorithm>
4 #include<queue>
5 using namespace std;
6 int mark[205][205];
7 char map[205][205];
8 int fx[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
9 int num[205][205],num1[205][205],num2[205][205];
10 struct node
11 {
12 int x,y;
13 }last,now;
14 int n,m;
15 queue<node>q;
16 void bfs(int a,int b)
17 {
18 while(!q.empty())
19 q.pop();
20 last.x=a;last.y=b;
21 q.push(last);
22 while(!q.empty())
23 {
24 last=q.front();
25 q.pop();
26 for(int i=0;i<4;i++)
27 {
28 now.x=last.x+fx[i][0];
29 now.y=last.y+fx[i][1];
30 if(now.x>=0&&now.x<=n&&now.y>=0&&now.y<=m&&mark[now.x][now.y]==0&&map[now.x][now.y]!='#')
31 {
32 q.push(now);
33 mark[now.x][now.y]=1;
34 num[now.x][now.y]=num[last.x][last.y]+1;
35 }
36 }
37 }
38 }
39 int main()
40 {
41 while(~scanf("%d %d",&n,&m))
42 {
43 int i,j,a,b,c,d;
44 for(i=0;i<n;i++)
45 scanf("%s",&map[i]);
46 for(i=0;i<n;i++)
47 {
48 for(j=0;j<m;j++)
49 {
50 if(map[i][j]=='Y')
51 {
52 a=i;b=j;
53 }
54 if(map[i][j]=='M')
55 {
56 c=i;d=j;
57 }
58 }
59 }
60 memset(mark,0,sizeof(mark));
61 memset(num,0,sizeof(num));
62 memset(num1,0,sizeof(num1));
63 bfs(a,b);
64 for(i=0;i<n;i++)
65 {
66 for(j=0;j<m;j++)
67 {
68 num1[i][j]=num[i][j];
69 }
70 }
71 memset(num,0,sizeof(num));
72 memset(mark,0,sizeof(mark));
73 memset(num2,0,sizeof(num2));
74 bfs(c,d);
75 for(i=0;i<n;i++)
76 {
77 for(j=0;j<m;j++)
78 {
79 num2[i][j]=num[i][j];
80 }
81 }
82 memset(num,0,sizeof(num));
83 memset(mark,0,sizeof(mark));
84 int min=10000000;
85 for(i=0;i<n;i++)
86 {
87 for(j=0;j<m;j++)
88 {
89 num[i][j]=num1[i][j]+num2[i][j];
90 if(map[i][j]=='@'&&min>num[i][j])
91 min=num[i][j];
92 }
93 }
94 printf("%d\n",min*11);
95 }
96 return 0;
97 }