1 条题解

  • 0
    @ 2025-8-24 22:40:51

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar fish_love_cat
    「要毁灭世界,根本不需要邪恶。起初,那些都是不会被任何人怪罪的小小愿望。而那样的愿望却如此轻易地,和末日相连在一起。」

    搬运于2025-08-24 22:40:51,当前版本为作者最后更新于2023-04-21 13:30:26,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    01 迷宫的弱化版,BFS 版子题,哪要什么最短路……

    唯一的区别就是没有墙了,改成只能走不同辐射区域。定义数组存辐射区能量正负极和安全区,所以要用整型变量。初始所有图内的点全部为真能走,走过的点不再重走置为假。所以只要这地方为真而且正负极与当前不同,即可入队。

    如果下一步是目的地,直接返回值即可。

    代码长这样:

    #include<bits/stdc++.h>
    using namespace std;
    int n,sx,sy,ex,ey;
    int f[105][105];
    bool b[105][105];
    struct wz{
        int x,y,ans;
    };
    queue<wz> q;
    int gx[4]={1,-1,0,0};
    int gy[4]={0,0,1,-1};
    int bfs(){
        wz a;
        a.x=sx;
        a.y=sy;
        a.ans=0;
        q.push(a);
        b[sx][sy]=false;
        while(!q.empty()){
            a=q.front();
            q.pop();
            for(int i=0;i<4;i++){
                wz xin;
                xin.x=a.x+gx[i];
                xin.y=a.y+gy[i];
                xin.ans=a.ans+1;
                if(xin.x==ex&&xin.y==ey) return xin.ans;
                if(b[xin.x][xin.y]&&f[xin.x][xin.y]!=f[a.x][a.y]) q.push(xin),b[xin.x][xin.y]=false;
            }
        }
        return -1;
    }
    int main(){
        cin>>n;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                char c;
                cin>>c;
                if(c=='+') f[i][j]=1;
                if(c=='-') f[i][j]=-1;
                if(c=='A') sx=i,sy=j;
                if(c=='B') ex=i,ey=j;
                b[i][j]=true;
            }
        }
        cout<<bfs();
        return 0;
    }
    
    • 1

    信息

    ID
    5941
    时间
    1000ms
    内存
    128MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者