请注意一次把所有可到达的点所花最短时间算一遍,比每找到@再寻找快!!!
一次一次找就会超时!!!
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
char mapp[210][210];
#define inf 100000000
int n,m;
int dir[4][2]={{0,-1},{0,1},{1,0},{-1,0}};
int pos1x,pos1y,pos2x,pos2y,posdx,posdy;
int visit[210][210];
int dist1[210][210],dist2[210][210];
struct stu
{
int x,y,step;
};
int BFS(stu stu1,int dist[][210])
{
int i;
queue<stu>k;
stu stu2;
memset(visit,0,sizeof(visit));
memset(dist,0,sizeof(dist));
k.push(stu1);
while(!k.empty())
{
stu1=k.front();
k.pop();
for(i=0;i<4;i++)
{
stu2.x=stu1.x+dir[i][0];
stu2.y=stu1.y+dir[i][1];
stu2.step=stu1.step+11;
if(stu2.x>=0&&stu2.x<n&&stu2.y>=0&&stu2.y<m&&visit[stu2.x][stu2.y]!=1&&mapp[stu2.x][stu2.y]!='#')
{
visit[stu2.x][stu2.y]=1;
dist[stu2.x][stu2.y]=stu2.step;
k.push(stu2);
}
}
}
}
int main()
{
int i,j,sum,Min;
stu stu1;
while(~scanf("%d%d",&n,&m))
{
Min=inf;
for(i=0;i<n;i++)
{
cin>>mapp[i];
}
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(mapp[i][j]=='Y')
{
pos1x=i;
pos1y=j;
}
if(mapp[i][j]=='M')
{
pos2x=i;
pos2y=j;
}
}
}
stu1.x=pos1x;
stu1.y=pos1y;
stu1.step=0;
BFS(stu1,dist1); //第一个人所有可到达的点所花最短时间
stu1.x=pos2x;
stu1.y=pos2y;
stu1.step=0;
BFS(stu1,dist2); //第二个人所有可到达的点所花最短时间
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(mapp[i][j]=='@')
{
if(dist1[i][j]!=0&&dist2[i][j]!=0)
{
Min=min(dist1[i][j]+dist2[i][j],Min);
}
}
}
}
cout<<Min<<endl;
}
return 0;
}