这题很简单啊~
思路:
碰到M和Y都进行一遍广搜,然后碰到@时就把位移路径放入ans[i][j] 然后在搜索结束后遍历一遍ans,找出来最小值就行
注意:
1 如果ans用数组存又初始化的话,没有被赋值的都是0,在用min寻找最小距离时时注意跳过这些
2 因为你会搜索两次地图(一次M,一次Y)所以记得每搜索一次之前都要清空visit;
代码如下:
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int m,n,visit[205][205],ans[205][205];
char map[205][205];
struct node{
int x;
int y;
};
node d,D;
void bfs(int x,int y){
queue<node>q;
while(!q.empty())q.pop();
d.x=x;d.y=y;
q.push(d);
int move[4][2]={0,1,1,0,0,-1,-1,0};
while(!q.empty()){
d=q.front();
q.pop();
for(int i=0;i<4;i++){
D.x=d.x+move[i][0];
D.y=d.y+move[i][1];
if(D.x>=1 && D.x<=m && D.y>=1 && D.y<=n && !visit[D.x][D.y] && map[D.x][D.y]!='#'){
visit[D.x][D.y]=visit[d.x][d.y]+1;
if(map[D.x][D.y]=='@'){
ans[D.x][D.y]+=visit[D.x][D.y];
}
q.push(D);
}
}
}
}
int main(){
while(cin>>m>>n){
memset(map,0,sizeof(map));
memset(ans,0,sizeof(ans));
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cin>>map[i][j];
}
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(map[i][j]=='Y' || map[i][j]=='M'){
memset(visit,0,sizeof(visit));
bfs(i,j);
}
}
}
int Min=99999;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(ans[i][j] && Min>ans[i][j]){
Min=ans[i][j];
}
}
}
cout<<Min*11<<endl;
}
}