记下两人坐标同时BFS即可,注意有的KCF可能到不了的情况
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <queue>
using namespace std;
int m,n,vis[210][210],t[210][210],t1[210][210];
char a[210][210];
struct point
{
int x;
int y;
}po[4];
queue<point>q;
void BFS1()
{
int x,y,i;
while(!q.empty())
{
po[3]=q.front();q.pop();
x=po[3].x;y=po[3].y;i=t1[y][x];
x++;
if(x<=n&&vis[y][x]==0&&(a[y][x]=='.'||a[y][x]=='@'))
{vis[y][x]=1;t1[y][x]=i+1;po[3].x=x;po[3].y=y;q.push(po[3]);}
x-=2;
if(x>=1&&vis[y][x]==0&&(a[y][x]=='.'||a[y][x]=='@'))
{vis[y][x]=1;t1[y][x]=i+1;po[3].x=x;po[3].y=y;q.push(po[3]);}
x++;y++;
if(y<=m&&vis[y][x]==0&&(a[y][x]=='.'||a[y][x]=='@'))
{vis[y][x]=1;t1[y][x]=i+1;po[3].x=x;po[3].y=y;q.push(po[3]);}
y-=2;
if(y>=1&&vis[y][x]==0&&(a[y][x]=='.'||a[y][x]=='@'))
{vis[y][x]=1;t1[y][x]=i+1;po[3].x=x;po[3].y=y;q.push(po[3]);}
}
return;
}
void BFS2()
{
int x,y,i;
while(!q.empty())
{
po[3]=q.front();q.pop();
x=po[3].x;y=po[3].y;i=t[y][x];
x++;
if(x<=n&&vis[y][x]==0&&(a[y][x]=='.'||a[y][x]=='@'))
{vis[y][x]=1;t[y][x]=i+1;po[3].x=x;po[3].y=y;q.push(po[3]);}
x-=2;
if(x>=1&&vis[y][x]==0&&(a[y][x]=='.'||a[y][x]=='@'))
{vis[y][x]=1;t[y][x]=i+1;po[3].x=x;po[3].y=y;q.push(po[3]);}
x++;y++;
if(y<=m&&vis[y][x]==0&&(a[y][x]=='.'||a[y][x]=='@'))
{vis[y][x]=1;t[y][x]=i+1;po[3].x=x;po[3].y=y;q.push(po[3]);}
y-=2;
if(y>=1&&vis[y][x]==0&&(a[y][x]=='.'||a[y][x]=='@'))
{vis[y][x]=1;t[y][x]=i+1;po[3].x=x;po[3].y=y;q.push(po[3]);}
}
return;
}
int main()
{
int i,j,s;
while(~scanf("%d %d",&m,&n))
{
s=100000;memset(t,0,sizeof(t));memset(t1,0,sizeof(t1));
if(m==0&&n==0) break;
for(j=1;j<=m;j++)
{
getchar();
for(i=1;i<=n;i++)
{
scanf("%c",&a[j][i]);
if(a[j][i]=='Y') {po[1].x=i;po[1].y=j;}
if(a[j][i]=='M') {po[2].x=i;po[2].y=j;}
}
}
memset(vis,0,sizeof(vis));
q.push(po[1]);vis[po[1].y][po[1].x]=1;BFS1();
memset(vis,0,sizeof(vis));
q.push(po[2]);vis[po[2].y][po[2].x]=1;BFS2();
for(j=1;j<=m;j++)
for(i=1;i<=n;i++) if(a[j][i]=='@'&&t[j][i]+t1[j][i]<s&&t[j][i]!=0&&t1[j][i]!=0) s=t[j][i]+t1[j][i];
printf("%d\n",s*11);
}
return 0;
}