bfs经典题,起点和终点分别bfs,借助于结构体,队列,枚举最后的共同终点所需的步数……
#include<bits/stdc++.h> using namespace std; char Map[205][205]; int vis[205][205],n,m,cnt; int dir[4][2]={{0,1},{1,0},{-1,0},{0,-1}}; struct node { int x; int y; int step; }; node path1[1001]; node path2[1001]; void bfs(int x,int y,node path[]) { int i; memset(vis,0,sizeof(vis)); queue<node>q; node s,e; s.x=x,s.y=y,s.step=0; q.push(s); while(!q.empty()) { s=q.front(); q.pop(); if(Map[s.x][s.y]=='@') path[cnt++]=s; for(int i=0;i<4;i++) { int newx=s.x+dir[i][0]; int newy=s.y+dir[i][1]; if(newx<0||newy<0||newx>=n||newy>=m) continue; if(Map[newx][newy]=='#') continue; if(vis[newx][newy]) continue; vis[newx][newy]=1; e.x=newx,e.y=newy,e.step=s.step+1; q.push(e); } } } int main() { while(scanf("%d%d",&n,&m)==2) { memset(path1,0,sizeof(path1)); memset(path2,0,sizeof(path2)); cnt=0; getchar(); int x1,y1,x2,y2; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { scanf("%c",&Map[i][j]); if(Map[i][j]=='Y') x1=i,y1=j; if(Map[i][j]=='M') x2=i,y2=j; } getchar(); } bfs(x1,y1,path1); int cnt1=cnt; cnt=0; bfs(x2,y2,path2); int cnt2=cnt; int minn=INT_MAX; for(int i=0;i<cnt1;i++) { for(int j=0;j<cnt2;j++) { if(path1[i].x==path2[j].x&&path1[i].y==path2[j].y) minn=min(minn,11*(path1[i].step+path2[j].step)); } } printf("%d\n",minn); } return 0; }