1 条题解
-
1
跑两遍bfs,用两个数组d和f分别记录小Y和小M到当前格子所需的时间 跑完之后再遍历一遍地图,到商店时更新答案,注意特判:需要都能够到商店
#include<bits/stdc++.h> using namespace std; #define int long long int n,m,sx,sy,ex,ey,ans=1e9; char a[210][210]; int d[210][210],f[210][210];//Y和M到当前格子所需要的时间 int dx[]={-1,1,0,0}; int dy[]={0,0,1,-1}; struct grid{ int x,y; };//公式 void bfs(int x,int y,int b[210][210]){//这里传int的数组会直接改变数组 但是vector需要加&引用 queue<grid>q; q.push({x,y}); b[x][y]=0; while(!q.empty()){ int tx=q.front().x,ty=q.front().y; q.pop(); for(int i=0;i<4;i++){ int nx=tx+dx[i],ny=ty+dy[i]; if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&a[nx][ny]!='#'&&b[nx][ny]==-1){//1.没有越界 //2.不是障碍# //3.没有访问过 b[nx][ny]=b[tx][ty]+11;//更新时间 q.push({nx,ny}); } } } } signed main(){ cin>>n>>m; //记录Y和M的坐标的同时初始化时间数组 for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>a[i][j]; if(a[i][j]=='Y')sx=i,sy=j; if(a[i][j]=='M')ex=i,ey=j; d[i][j]=-1; f[i][j]=-1; } } bfs(sx,sy,d);//Y bfs(ex,ey,f);//M for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(a[i][j]=='@'){ if(d[i][j]!=-1&&f[i][j]!=-1){//都可以到这个商店就更新答案 ans=min(ans,d[i][j]+f[i][j]); } } } } cout<<ans; }
- 1
信息
- ID
- 525
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- 递交数
- 19
- 已通过
- 5
- 上传者