很简单的bfs题,没想到还被卡了几下。
需要注意的是有的kcf两个人都到不了的话不能考虑在内
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#define f first
#define s second
using namespace std;
typedef pair<int,int> PII;
char mp[202][202];
int vis[202][202][2],n,m,mi,mj,yi,yj;
int dx[] = {0,0,-1,1},dy[] = {1,-1,0,0};
void bfs(int idx){
queue<PII> Q;
if(!idx) Q.push({yi,yj}),vis[yi][yj][idx] = 0;
else Q.push({mi,mj}),vis[mi][mj][idx] = 0;
while(Q.size()){
PII u = Q.front();Q.pop();
for(int i = 0;i<4;i++){
int nx = u.f + dx[i] ,ny = u.s + dy[i];
if(nx >= 0 && nx < n && ny >=0 && ny < m && mp[nx][ny] != '#' && vis[nx][ny][idx] == -1) {
vis[nx][ny][idx] = vis[u.f][u.s][idx] + 1;
Q.push({nx,ny});
}
}
}
}
int main(){
while(~scanf("%d%d",&n,&m)){
for(int i = 0;i<n;i++) scanf("%s",mp[i]);
vector<PII> tmp;
for(int i = 0;i<n;i++)
for(int j = 0;j<m;j++)
if(mp[i][j] == 'M') mi = i,mj = j;
else if(mp[i][j] == 'Y') yi = i,yj = j;
else if(mp[i][j] == '@') tmp.push_back({i,j});
memset(vis,-1,sizeof(vis));
bfs(0); bfs(1);
int ans = 1e9 ;
for(int i = 0;i<tmp.size();i++)
if(vis[tmp[i].f][tmp[i].s][0] != -1 && vis[tmp[i].f][tmp[i].s][1] != -1)
ans = min(ans,vis[tmp[i].f][tmp[i].s][0] + vis[tmp[i].f][tmp[i].s][1]);
printf("%d\n",ans * 11);
}
return 0;
}