题意:
yifenfei和merceki要去KFC聚会,给出一个地方的地图,n*m,有若干个个KFC,然后他们每走一步需要11分钟(注意:这里时间不能重叠的,比如yi走了一步,me也是走了一步,则一共的时间为2*11,而不是1*11),问他们在哪个KFC聚会所花的时间最少,输出最少的时间。
这道题我本来是想,枚举每一个KFC,分别对每一个KFC进行2次BFS,求出去每一个KFC所花的时间。觉得这样很慢吧。
后来就是,先对yi,求出他到每一个KFC的时间,记录下来,再对me,求出他到每一个KFC的时间,记录下来,再选择哪个好,这样一共只需要2次BFS就ok了。
ac代码:
1 #include<cstdio> 2 #include<queue> 3 #include<algorithm> 4 #include<cstring> 5 using namespace std; 6 const int maxn=210; 7 int y[maxn][maxn]; 8 int k[maxn][maxn]; 9 char maze[maxn][maxn]; 10 int dx[4]={0,0,-1,1}; 11 int dy[4]={1,-1,0,0}; 12 int n,m; 13 bool vis[maxn][maxn]; 14 struct Point 15 { 16 int x,y,step; 17 }; 18 void bfs(int i,int j,int who) 19 { 20 memset(vis,false,sizeof(vis)); 21 Point s; 22 s.x=i; 23 s.y=j; 24 s.step=0; 25 queue<Point>que; 26 while(!que.empty()) 27 que.pop(); 28 que.push(s); 29 vis[i][j]=true; 30 while(!que.empty()){ 31 Point u=que.front(); 32 que.pop(); 33 if(maze[u.x][u.y]=='@'&&who==1){ 34 y[u.x][u.y]=u.step; 35 } 36 else if(maze[u.x][u.y]=='@'&&who==2){ 37 k[u.x][u.y]=u.step; 38 } 39 for(int i=0;i<4;i++){ 40 Point du; 41 du.x=u.x+dx[i]; 42 du.y=u.y+dy[i]; 43 du.step=u.step+1; 44 if(du.x>=0&&du.x<n&&du.y>=0&&du.y<m&&maze[du.x][du.y]!='#' 45 &&!vis[du.x][du.y]){ 46 que.push(du); 47 vis[du.x][du.y]=true; 48 } 49 } 50 } 51 } 52 int main() 53 { 54 while(scanf("%d%d",&n,&m)!=EOF){ 55 char s[maxn]; 56 for(int i=0;i<n;i++){ 57 scanf("%s",&s); 58 for(int j=0;j<m;j++) 59 maze[i][j]=s[j]; 60 } 61 memset(y,-1,sizeof(y)); 62 memset(k,-1,sizeof(m)); 63 for(int i=0;i<n;i++){ 64 for(int j=0;j<m;j++){ 65 if(maze[i][j]=='Y'){ 66 bfs(i,j,1); 67 } 68 else if(maze[i][j]=='M') 69 bfs(i,j,2); 70 } 71 } 72 int ans=0x3f3f3f3f; 73 for(int i=0;i<n;i++) 74 for(int j=0;j<m;j++){ 75 if(y[i][j]!=-1&&k[i][j]!=-1&&y[i][j]+k[i][j]<ans) 76 ans=y[i][j]+k[i][j]; 77 } 78 printf("%d ",ans*11); 79 } 80 return 0; 81 }