maze 题解

maze

https://ac.nowcoder.com/acm/problem/15665

这道题,因为传送阵需要3s,所以,我们如果打普通的bfs可能会挂,于是,为了满足正确性,就可以类比01bfs之类的,搞个优先队列做。。。

但是,个人觉得有点麻烦,我们不妨从"这道题是一个搜索题"这个想法中解放出来,那么,这题就变成了一道明显的最短路问题啦!我们先利用网络图连边,然后再把传送阵的q条边添加进来就好辣!

因为有网格图,所以不建议打spfa(除非进行些玄学优化),剩下的就是dijkstra板子了!

(注意清空数组)

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=301,M=300*300*4+1001;
char a[N][N];
struct node{
    int v,w,nex;
}t[M];
int dx[4]={0,0,-1,1};
int dy[4]={1,-1,0,0};
bool vis[N*N];int dis[N*N];
int las[N*N],len;
inline void add(int u,int v,int w){
    t[++len]=(node){v,w,las[u]},las[u]=len;
}
inline void dijkstra(int st){
    memset(dis,0x3f3f,sizeof(dis));
    memset(vis,0,sizeof(vis));
    priority_queue<pair<int,int> >sp;
    dis[st]=0;sp.push(make_pair(0,st));
    while(!sp.empty()){
        int x=sp.top().second;sp.pop();
        if(vis[x])continue;
        vis[x]=1;
        for(int i=las[x];i;i=t[i].nex){
            int v=t[i].v,w=t[i].w;
            if(dis[v]>dis[x]+w){
                dis[v]=dis[x]+w;
                sp.push(make_pair(-dis[v],v));
            }
        }
    }
}
int main(){
    int n,m,q;
    while(~scanf("%d%d%d",&n,&m,&q)){
        memset(las,0,sizeof(las)),len=0;
        int sx,sy,tx,ty;
        for(int i=1;i<=n;++i){
            for(int j=1;j<=m;++j){
                scanf(" %c",&a[i][j]);
                if(a[i][j]=='S'){
                    sx=i,sy=j;
                }
                if(a[i][j]=='T'){
                    tx=i,ty=j;
                }
            }
        }
        for(int i=1;i<=n;++i){
            for(int j=1;j<=m;++j){
                if(a[i][j]!='#'){
                    for(int k=0;k<4;++k){
                        int x=i+dx[k],y=j+dy[k];
                        if(x&&x<=n&&y&&y<=m&&a[x][y]!='#'){
                            add((i-1)*m+j,(x-1)*m+y,1);
                        }
                    }
                }
            }
        }
        for(int i=1;i<=q;++i){
            int x1,x2,y1,y2;
            scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
            ++x1,++y1,++x2,++y2;
            add((x1-1)*m+y1,(x2-1)*m+y2,3);
        }
        dijkstra((sx-1)*m+sy);
        if(!vis[(tx-1)*m+ty]){
            puts("-1");
        }else{
            printf("%d\n",dis[(tx-1)*m+ty]);
        }
    }
    return 0;
}
全部评论

相关推荐

当年还在美团那个倒霉的&nbsp;Peppr&nbsp;团队工作时,我一直有个疑问:这群人每天到底在自嗨什么。每次开会一堆人围着一堆“看起来很高级”的文档转,模板统一、名词复杂、页数感人,每一页都在暗示一件事:“你不懂,是因为你不专业。”但现实是——代码照样写在&nbsp;💩&nbsp;山上,该出问题还是会出问题,这真的很逗,系统一出问题,文档的唯一作用就是证明:“我们当初确实认真写过文档。”所以本质区别到底是什么?是代码质量提升了,还是大家在精神层面完成了一次“工程师&nbsp;cosplay”?有句话说得好潮水退去才知道谁在裸泳。还记得当时的马哥、明哥(图&nbsp;1&nbsp;左)最爱反复强调一句话:“所有场景一定要想到。”、“这个场景为什么没考虑到?”不过他们这些话我是真的听进去了。不然我也不会在一年多前就说:这个项目活不过两年。顺带一提,那段时间还有个固定节目。每次下楼,总能听见我明哥在吐槽不同的人。我从他身后绕过去,经常能听到他一边抽烟一边说:“xx&nbsp;这小子太坑了,回头我一定要跟马哥说说。”于是深谙人情世故但真不会抽烟的我也会从口袋掏出一支低尼古丁含量的烟给自己点上,假意自己什么都没听到什么都不知道,只是来抽烟的。后来我才明白,这可能也是团队文化的一部分:问题永远在别人身上,而我们,永远在复盘里😂。
秋招白月光
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务