1 条题解

  • 0
    @ 2026-4-9 12:49:10

    写代码不易,点个赞吧!

    切勿抄袭。

    #include "bits/stdc++.h"
    #define int long long
    using namespace std;
    const int N=1010;
    struct stu{
        int x,y,qdr,bs;
        /*
        0:上
        1:下
        2:左
        3:右
        4:无
        */
        bool tx,qp;
    };
    int n,m,a[N][N];
    bool vs[N][N][2][4]; //行、列、通行证、方向4状态
    int dir[10][1]={{-1,0},{1,0},{0,-1},{0,1}};
    bool check(int x,int y,bool tx){
        if(x<1||x>n||y<1||y>m||a[x][y]==0){ //超出地图边界或封闭区
            return 0;
        }
        if(a[x][y]==3&&!tx){ //管控区但没有通行证
            return 0;
        }
        return 1;
    }
    queue<stu>q;
    signed main(){
        scanf("%lld%lld",&n,&m);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                scanf("%lld",&a[i][j]);
            }
        }
        q.push({1,1,4,0,0,0});
        while(!q.empty()){
            stu t=q.front();
            q.pop();
            int s=t.bs+1;
            if(t.x==n&&t.y==m){ //到达终点
                printf("%lld",t.bs);
                return 0;
            }
            if(t.qp){ //快速通道
                t.tx=0;
                int nx=t.x,ny=t.y;
                nx+=dir[t.qdr][0];
                ny+=dir[t.qdr][1];
                if(a[nx][ny]==4){ //还是快速通道 
                	q.push({nx,ny,t.qdr,s,0,1});
                    vs[nx][ny][0][t.qdr]=1;
                    continue;
                }
                else if(check(nx,ny,0)){ //非快速但可走 
                	q.push({nx,ny,4,s,0,0});
                    if(a[t.x][t.y]==2){ //补给点
                        t.tx=1;
                    }
                    vs[nx][ny][t.tx][t.qdr]=1;
                    continue;
                }
            }
            if(a[t.x][t.y]==2){ //补给点
                t.tx=1;
            }
            for(int i=0;i<4;i++){ //正常行走
                int nx=t.x,ny=t.y;
                nx+=dir[i][0],ny+=dir[i][1];
                if(a[nx][ny]==4&&!vs[nx][ny][t.tx][i]){ //是快速通道
                    vs[nx][ny][t.tx][i]=1;
                    q.push({nx,ny,i,s,0,1});
                }
                else if(check(nx,ny,t.tx)&&!vs[nx][ny][t.tx][i]){ //不是快速通道且可走
                    vs[nx][ny][t.tx][i]=1;
                    q.push({nx,ny,4,s,t.tx,0});
                }
            }
        }
        printf("-1");
        return 0;
    }
    

    信息

    ID
    6062
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    (无)
    递交数
    23
    已通过
    2
    上传者