1 solutions

  • 1
    @ 2024-4-16 19:25:52

    题意

    一个玉米园,有草地,玉米,起点,终点,传送装置

    不踩玉米地从起点到终点的最短路(用BFS)

    • 起点 "@"
    • 终点 "="
    • 玉米 "#"
    • 草地 "." 可以通过四联通行走,每步耗费1单位时间
    • 传送装置 "A"~"Z" ,每个字母只能出现一对,可以互传位置不耗费单位时间,但不代表走到传送装置面前不用耗费

    思路

    BFS

    其他不难,这道题主要难在传送装置(对于我这种蒟蒻来说,还好)

    传送装置使用结构体

    传送装置的数组要用字符的ascii来代替下标

    如遇到字母就判断是第一个还是第二个

    代码

    #include<iostream>
    #include<queue>
    using namespace std;
    int n,m;
    char a[114*3][514];//图
    int vis[114*3][514]={0};//标记探索
    int xl[4]={0,0,1,-1};//相对坐标
    int yl[4]={1,-1,0,0};//相对坐标
    int sx,sy,ex,ey;//起点与终点坐标
    struct xy
    {
        int x,y,c;
    };//用于BFS
    queue<xy >q;
    struct csxy
    {
        int x1=-1,y1=-1,x2=-1,y2=-1;//注意初始值
    }cs[114];//用于传送装置
    int main()
    {
        cin>>n>>m;//输入
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                cin>>a[i][j];//输入
                if(a[i][j]=='@')sx=i,sy=j;//标记起点
                if(a[i][j]=='=')ex=i,ey=j;//标记终点
                if(a[i][j]>='A' && a[i][j]<='Z')//传送装置
                {
                    if(cs[a[i][j]].x1==-1)//是第一个时(因为初始值为-1)
                    {
                        cs[a[i][j]].x1=i,cs[a[i][j]].y1=j;//标记
                    }
                    else//是第二个时
                    {
                        cs[a[i][j]].x2=i,cs[a[i][j]].y2=j;//标记
                    }
                }
            }
        }
        q.push({sx,sy,0});//初始为0
        while(q.size())//BFS
        {
            xy e=q.front();//方便获取
            q.pop();
            if(e.x==ex && e.y==ey)//为终点时
            {
                cout<<e.c;//输出步数
                return 0;//记住要结束
            }
            if(vis[e.x][e.y])//标记过时
            {
                continue;//不再探索
            }
            vis[e.x][e.y]=1;//标记
            for(int i=0;i<4;i++)//四联通
            {
                int x=e.x+xl[i];//获取坐标
    			int y=e.y+yl[i];//获取坐标
                if(x<0 && x>=n && y<0 && y>=m)//超出范围
                {
                    continue;//不再探索
                }
                if(a[x][y]=='#')//为玉米时
                {
                	continue;//不再探索
    			}
                if(cs[a[x][y]].x1!=-1)//是个传送装置
                {
                    if(cs[a[x][y]].x1==x && cs[a[x][y]].y1==y)//为第一个,这里要加1的原因是,你也要走到传送装置面前
                    {
                        q.push({cs[a[x][y]].x2,cs[a[x][y]].y2,e.c+1});//push
                    }
                    else//为第二个,这里要加1的原因是,你也要走到传送装置面前
                    {
                        q.push({cs[a[x][y]].x1,cs[a[x][y]].y1,e.c+1});//push
                    }
                }
                else
                {
                    q.push({x,y,e.c+1});//正常的草地
                }
            }
        }
        return 0;//完结散花
    }
    
    • 1

    Information

    ID
    992
    Time
    1000ms
    Memory
    512MiB
    Difficulty
    8
    Tags
    # Submissions
    53
    Accepted
    10
    Uploaded By