66
#include <cstdio> #include <cstring> #include <queue> using namespace std; typedef struct rot{ int x, y; int num; }rot; int m, n; rot Y, M; int dir[4][2]={ {0,1},{0,-1},{1,0},{-1,0} }; int v[220][220]; bool pos[220][220]; char ch[220][220]; bool judge( rot x ) { if( x.x<0||x.x>m || x.y<0||x.y>n || pos[x.x][x.y] ) return false; if( ch[x.x][x.y]=='#' ) return false; return true; } void find_ym() { for(int i=0; i<m; i++){ for(int j=0; j<n; j++){ if(ch[i][j]=='Y'){ Y.x=i; Y.y=j; } else if(ch[i][j]=='M'){ M.x=i; M.y=j; } } } } void bfs(int x, int y) { rot now, next; queue<rot>Q; now.x=x; now.y=y; now.num=0; pos[now.x][now.y]=true; Q.push(now); while( !Q.empty() ){ now=Q.front(); Q.pop(); for(int i=0; i<4; i++){ next.x=now.x+dir[i][0]; next.y=now.y+dir[i][1]; next.num=now.num+1; if( judge(next) ){ pos[next.x][next.y]=true; Q.push(next); if( ch[next.x][next.y]=='@' ) v[next.x][next.y] += next.num; } } } } int find_ans() { int ans=0x7fffffff; for(int i=0; i<m; i++){ for(int j=0; j<n; j++){ if(ch[i][j]=='@'){ if( v[i][j] ) ans = ans>v[i][j]?v[i][j]:ans; } } } return ans; } int main() { while( scanf("%d%d", &m, &n)!=-1 ){ for(int i=0; i<m; i++){ scanf("%s", ch[i]); } memset(v, 0, sizeof(v)); find_ym(); memset(pos, false, sizeof(pos)); bfs(Y.x, Y.y); memset(pos, false, sizeof(pos)); bfs(M.x, M.y); printf("%d\n", find_ans()*11 ); } return 0; }