地图上有两个人想去KFC见面,地图上有多个KFC,问两个人走路的时间和最少是多少。
分别从两个人的地方开始做两次bfs存距离就完事了……不要从每一个KFC bfs ,会超时……为什么第一次会用这个办法……
AC代码:
#include<cstdio>
#include<queue>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
typedef pair<int,int> P;
typedef long long LL;
typedef vector<int> V;
#define V(x) vector<x>
const int INF=0x3f3f3f3f,MAXN=1000000000+7;
int T,vis[205][205],cnt=1,m,n,ans=INF;
int A[205][205],B,C,a,b,c,dr[]={-1,1,0,0},dc[]={0,0,-1,1},J;
char pic[205][205];
struct node{
int a,b,c;
node(int x,int y,int z){ a=x,b=y,c=z;}
/*bool operator ==(node &u){
return a==u.a&&b==u.b&&c==u.c;
}*/
bool operator <(const node &u)const {
return a<u.a||(a==u.a&&b<u.b)||(a==u.a&&b==u.b&&c<u.c);
}
};
int bfs(P x){
int t=0;
queue<P> que;
que.push(x);
vis[x.first][x.second]=1;
while (!que.empty()){
P u=que.front(); que.pop();
int r=u.first,c=u.second;
if (pic[r][c]=='@'){
A[r][c]+=vis[r][c]-1;
}
for (int i=0;i<4;i++){
int nr=r+dr[i],nc=c+dc[i];
if (!vis[nr][nc]&&nr>=1&&nr<=n&&nc>=1&&nc<=m&&pic[nr][nc]!='#'){
que.push(make_pair(nr,nc));
vis[nr][nc]=vis[r][c]+1;
}
}
}
}
int main(){
while (scanf("%d%d",&n,&m)==2){
memset(A,0,sizeof(A));
memset(vis,0,sizeof(vis));
P Y,M;
ans=INF;
for (int i=1;i<=n;i++){
for (int j=1;j<=m;j++){
scanf(" %c",&pic[i][j]);
if (pic[i][j]=='Y') Y=make_pair(i,j);
if (pic[i][j]=='M') M=make_pair(i,j);
}
}
bfs(Y);
memset(vis,0,sizeof(vis));
bfs(M);
for (int i=1;i<=n;i++){
for (int j=1;j<=m;j++){
if (A[i][j]!=0) ans=min(ans,A[i][j]);
}
}
printf("%d\n",ans*11);
}
}