1 条题解

  • 0
    @ 2023-10-18 10:01:24

    C++ :

    #include<bits/stdc++.h>
    using namespace std;
    const int N=510;
    char g[N][N];
    int dist[N][N],st[N][N];
    #define x first
    #define y second
    typedef pair<int,int> PII;
    int n,m;
    int bfs()
    {
        memset(dist,0x3f,sizeof dist);
        memset(st,0,sizeof st);
        deque<PII> q;
        q.push_back({0,0});
        dist[0][0]=0;
        int dx[]={-1,-1,1,1},dy[]={-1,1,-1,1}; //格点的坐标变化
        int ix[]={-1,-1,0,0},iy[]={-1,0,-1,0}; //电子元件的坐标
        char cs[]="\\//\\"; //对应方向的合法电子元件方向
        while(q.size())
        {
            PII t=q.front();
            q.pop_front();
            if(st[t.x][t.y]) continue; //冗余备份
            st[t.x][t.y]=1; //标记已经获得最短路
            for(int i=0;i<4;i++)
            {
                int a=t.x+dx[i],b=t.y+dy[i]; //计算下一个格点坐标
                int ga=t.x+ix[i],gb=t.y+iy[i]; //计算电子元件坐标
                int w=cs[i]==g[ga][gb]?0:1; //判断权重
                if(a<0||a>n||b<0||b>m) continue; //越界
                if(dist[a][b]<=dist[t.x][t.y]) continue; //距离更差
                dist[a][b]=dist[t.x][t.y]+w; //更新距离
                if(w) q.push_back({a,b}); //后面入队
                else q.push_front({a,b}); //前面入队
            }
        }
        return dist[n][m];
    }
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            cin>>n>>m;
            for(int i=0;i<n;i++) cin>>g[i];
            int t=bfs();
            if(t==0x3f3f3f3f) cout<<"NO SOLUTION"<<endl;
            else cout<<t<<endl;
        }
        return 0;
    }
    
    • 1

    信息

    ID
    781
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者