<题目链接>
题目大意:
两个人分别从地图中的Y 和 M出发,要共同在 @ 处会面(@不止有一处),问这两个人所走距离和的最小值是多少。
解题分析:
就是对这两个点分别进行一次BFS,求出它们到每一个 @ 点的最短距离,然后距离和最小的即为所求(图上一步相当于 11)。此题有坑,必须判断两个人是否都能够走到那个@点,如果不能走到,那么那个距离和应该作废。
#include<iostream> #include<queue> #include<algorithm> #include<memory.h> #include<utility> using namespace std; typedef pair<int,int> P; const int MAX=201; int dir[4][2]={1,0,0,1,-1,0,0,-1}; char maze[MAX][MAX]; int visa[MAX][MAX],visb[MAX][MAX]; int n,m; void bfs(int x,int y,int vis[][MAX]) { queue<P>q; q.push(P(x,y)); while(!q.empty()) { P p=q.front(); q.pop(); for(int i=0;i<4;i++) { int nx=p.first+dir[i][0],ny=p.second+dir[i][1]; if(nx>=0&&ny>=0&&nx<n&&ny<m&&maze[nx][ny]!='#'&&vis[nx][ny]==0) { vis[nx][ny]=vis[p.first][p.second]+11; q.push(P(nx,ny)); } } } } int main() { while(~scanf("%d%d",&n,&m)) { int a,b,c,d; memset(visa,0,sizeof(visa)); memset(visb,0,sizeof(visb)); for(int i=0;i<n;i++){ scanf("%s",&maze[i]); for(int j=0;j<m;j++) { if(maze[i][j]=='Y') { a=i,b=j; } if(maze[i][j]=='M') { c=i,d=j; } } } bfs(a,b,visa); bfs(c,d,visb); int mini=0x3f3f3f3f; for(int i=0;i<n;i++) for(int j=0;j<m;j++) if(maze[i][j]=='@'&&visa[i][j]+visb[i][j]!=0) //未到达的KFC mini=min(mini,visa[i][j]+visb[i][j]); cout<<mini<<endl; } return 0; }
这是我的代码,WA了,但是不知道为什么,先记录下来。
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <queue> using namespace std; const int maxn=200+50; #define INF 0x3f3f3f3f int n,m; char mpa[maxn][maxn]; int vis[maxn][maxn]; int dis[maxn]; int arrive[maxn]; int dir[][2]={1,0,0,1,-1,0,0,-1}; struct NODE{ int x,y; NODE(int a=0,int b=0){ x=a,y=b; } }; vector<NODE>v; struct node{ int x,y; int step; node(int a=0,int b=0,int c=0):x(a),y(b),step(c){} }; void bfs(node ital){ memset(vis,0,sizeof(vis)); queue<node>q; q.push(ital); vis[ital.x][ital.y]=1; while(!q.empty()){ node now=q.front(); q.pop(); if(mpa[now.x][now.y]=='@'){ for(int i=0;i<v.size();i++){ if(v[i].x==now.x&&v[i].y==now.y){ dis[i]+=now.step; arrive[i]++; } } } for(int k=0;k<4;k++){ int xx=now.x+dir[k][0]; int yy=now.y+dir[k][1]; if(xx<1||xx>n||yy<1||yy>m||vis[xx][yy]||mpa[xx][yy]=='#')continue; if(mpa[xx][yy]=='Y'||mpa[xx][yy]=='M')continue; vis[xx][yy]=1; q.push(node(xx,yy,now.step+1)); } } } int main(){ while(scanf("%d %d",&n,&m)!=EOF){ v.clear(); for(int i=1;i<=n;i++){ scanf("%s",mpa[i]+1); for(int j=1;j<=m;j++){ if(mpa[i][j]=='@'){ v.push_back(NODE(i,j)); //将全部 @单独地存到vector中,这样会给每一个@编号,方便查询 } } } memset(arrive,0,sizeof(arrive)); memset(dis,0,sizeof(dis)); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(mpa[i][j]=='Y'||mpa[i][j]=='M'){ bfs(node(i,j,0)); } } } int mx=INF; for(int i=0;i<v.size();i++){ if(arrive[i]!=2)dis[i]=INF; //如果这个KFC不是两个人都能到达,那么求出来的dis无效,所以将其设为INF mx=min(mx,dis[i]); } printf("%d ",mx*11); } return 0; }
2018-08-29