1 条题解

  • 1
    @ 2026-3-6 10:54:17

    跑两遍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
    标签
    递交数
    28
    已通过
    6
    上传者