两个BFS即可。。
#include"stdio.h" #include"string.h" #include"queue" #define N 205 using namespace std; char str[N][N]; int n,m,a1[1004]={0},a2[1004]={0}; int sum,k,b1[1004]={0},b2[1004]={0}; int map[N][N]; int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; struct node { int x,y,step; }; struct ss { int x,y; }s[1004]; int join(int x,int y) { int i; for(i=1;i<k;i++) if(s[i].x==x&&s[i].y==y) return i; return -1; } void bfs1(int x,int y) { queue<node>Q; node q,p; p.x=x; p.y=y; p.step=0; memset(map,0,sizeof(map)); int t,i; map[x][y]=0; Q.push(p); while(!Q.empty()) { p=Q.front(); Q.pop(); t=join(p.x,p.y); if(t) { map[p.x][p.y]=1; a1[t]=p.step; } for(i=0;i<4;i++) { q=p; q.x+=dir[i][0]; q.y+=dir[i][1]; q.step+=11; if(q.x>=0&&q.x<n&&q.y>=0&&q.y<m &&!map[q.x][q.y]&&str[q.x][q.y]!='#') { map[q.x][q.y]=1; Q.push(q); } } for(i=1;i<k;i++) { if(a1[i])b1[i]=a1[i]; else b1[i]=-1; } } } void bfs2(int x,int y) { queue<node>Q; node q,p; p.x=x; p.y=y; p.step=0; memset(map,0,sizeof(map)); int t,i; map[x][y]=0; Q.push(p); while(!Q.empty()) { p=Q.front(); Q.pop(); t=join(p.x,p.y); if(t) { map[p.x][p.y]=1; a2[t]=p.step; } for(i=0;i<4;i++) { q=p; q.x+=dir[i][0]; q.y+=dir[i][1]; q.step+=11; if(q.x>=0&&q.x<n&&q.y>=0&&q.y<m &&!map[q.x][q.y]&&str[q.x][q.y]!='#') { map[q.x][q.y]=1; Q.push(q); } } for(i=1;i<k;i++) { if(a2[i])b2[i]=a2[i]; else b2[i]=-1; } } } int main() { int i,j; int x1,x2,y1,y2,min; while(scanf("%d%d",&n,&m)!=EOF&&n&&m) { k=1; min=100000; for(i=0;i<n;i++) scanf("%s",str[i]); for(i=0;i<n;i++) { for(j=0;j<m;j++) { if(str[i][j]=='Y') { x1=i;y1=j; } if(str[i][j]=='M') { x2=i;y2=j; } if(str[i][j]=='@') { s[k].x=i; s[k++].y=j; } } } bfs1(x1,y1); bfs2(x2,y2); for(i=1;i<k;i++) { if(b1[i]!=-1&&b2[i]!=-1) { sum=b1[i]+b2[i]; if(min>sum) min=sum; } } printf("%d\n",min); } return 0; }