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 }