两个人(Y和M)要在‘@’处相遇,图中有不定个‘@’;
对每个人做一遍BFS即可,然后枚举每个‘@’位置
#include "stdio.h" #include "string.h" #include "queue" using namespace std; const int inf=0x7fffffff; const int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; struct node { int x,y,t; }; int y_n,y_m,m_n,m_m,n,m; char str[210][210]; int sum[210][210],mark[210][210]; int Min(int a,int b) { if (a<b) return a;else return b; } int judge(int x,int y) { if (x<0 || y<0 || x>=n || y>=m) return 0; if (mark[x][y]==1) return 0; if (str[x][y]=='#') return 0; return 1; } void bfs() { queue<node>q,qq; node cur,next; int i; cur.x=y_n; cur.y=y_m; cur.t=0; memset(mark,0,sizeof(mark)); mark[y_n][y_m]=1; sum[cur.x][cur.y]=0; q.push(cur); while (!q.empty()) { cur=q.front(); q.pop(); for (i=0;i<4;i++) { next.x=cur.x+dir[i][0]; next.y=cur.y+dir[i][1]; if (judge(next.x,next.y)==0) continue; next.t=cur.t+1; mark[next.x][next.y]=1; sum[next.x][next.y]=next.t; q.push(next); } } cur.x=m_n; cur.y=m_m; cur.t=0; memset(mark,0,sizeof(mark)); mark[m_n][m_m]=1; qq.push(cur); while(!qq.empty()) { cur=qq.front(); qq.pop(); for (i=0;i<4;i++) { next.x=cur.x+dir[i][0]; next.y=cur.y+dir[i][1]; if (judge(next.x,next.y)==0) continue; next.t=cur.t+1; mark[next.x][next.y]=1; sum[next.x][next.y]+=next.t; qq.push(next); } } } int main() { int i,j,ans; while (scanf("%d%d",&n,&m)!=EOF) { 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') { y_n=i; y_m=j; } else if (str[i][j]=='M') { m_n=i; m_m=j; } memset(sum,-1,sizeof(sum)); bfs(); ans=inf; for (i=0;i<n;i++) for (j=0;j<m;j++) if (str[i][j]=='@' && sum[i][j]!=-1) ans=Min(ans,sum[i][j]); printf("%d\n",ans*11); } return 0; }
时间: 2024-10-04 11:16:22