题目:
https://vjudge.net/problem/HDU-2612
思路:用两次bfs
之前wa是没有判两人能否到达麦当劳
#include<stdio.h> #include<string.h> #include<queue> using namespace std; int n,m; int v[202][202],vis[202][202],dy[202][202],dm[202][202]; char h[202][202]; struct mai { int pi,pj; }ma[202]; queue<mai> que; struct node { int i,j; }no[202]; int x[5]={0,0,1,-1}; int yy[5]={-1,1,0,0}; void bfs(node y) { queue<node> qq; memset(v,0,sizeof(v)); memset(dy,0,sizeof(dy)); dy[y.i][y.j]=0; v[y.i][y.j]=1; qq.push(y); while(!qq.empty()) { node r=qq.front(); qq.pop(); int ri=r.i; int rj=r.j; for(int i=0;i<4;i++) { int ii=ri+x[i]; int jj=rj+yy[i]; if(h[ii][jj]!='#'&&!v[ii][jj]&&ii>=1&&ii<=n&&jj>=1&&jj<=m) { v[ii][jj]=1; dy[ii][jj]=dy[ri][rj]+1; node z; z.i=ii; z.j=jj; qq.push(z); } } } } void bbfs(node ming) { queue<node> qw; memset(vis,0,sizeof(vis)); memset(dm,0,sizeof(dm)); dm[ming.i][ming.j]=0; vis[ming.i][ming.j]=1; qw.push(ming); while(!qw.empty()) { node r=qw.front(); qw.pop(); int ri=r.i; int rj=r.j; for(int i=0;i<4;i++) { int ii=ri+x[i]; int jj=rj+yy[i]; if(h[ii][jj]!='#'&&!vis[ii][jj]&&ii>=1&&ii<=n&&jj>=1&&jj<=m) { vis[ii][jj]=1; dm[ii][jj]=dm[ri][rj]+1; node z; z.i=ii; z.j=jj; qw.push(z); } } } } int main() { while(scanf("%d %d",&n,&m)!=EOF) { node y,ming; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) {scanf(" %1c",&h[i][j]); if(h[i][j]=='@') { mai fir; fir.pi=i; fir.pj=j; que.push(fir); } if(h[i][j]=='Y') { y.i=i; y.j=j; } if(h[i][j]=='M') { ming.i=i; ming.j=j; } } } bfs(y); bbfs(ming); int mmin=99999999; while(!que.empty()) { mai tt=que.front(); que.pop(); if(dy[tt.pi][tt.pj]+dm[tt.pi][tt.pj]<mmin&&v[tt.pi][tt.pj]&&vis[tt.pi][tt.pj]) { mmin=dy[tt.pi][tt.pj]+dm[tt.pi][tt.pj]; } } printf("%d\n",mmin*11); } }