CSUOJ 1829Dungeon最短路 BFS预处理增加维数

    xiaoxiao2021-03-25  59

            其实在比赛的时候就想到了,在BFS的时候增加一维时间,也就是本来是在平面上的迷宫现在变成了立体的,每一次BFS的时候都向下一层判断5个格子。

            我在比赛的时候想到了增加一维时间。。。最坏情况考虑在原地等待15S,然后从左下角到右上角消耗30S,时间维最多不超过50,但是为了保险起见还是开了100

            比赛的时候没写出来,理由是预处理有点难写呀

            在每一S都要把对应的陷阱的位置写出来,判断不能出界,出界了要保持在原地。。。。。

            赛后写出来了,权当是练手了吧。

    #include <iostream> #include <queue> #include <cstring> #include <algorithm> using namespace std; const int dx[]{0,0,0,1,-1},dy[]{0,1,-1,0,0}; struct Node{ int x,y,z; explicit Node(int a=0,int b=0,int c=0):x(a),y(b),z(c){} }node; bool board[20][20][100],flag; int t,r,c,k,pr[20],pc[20],qr[20],qc[20],dr[20],dc[20],res[20][20][100]; void pretreatment(); inline bool judgeInBoard(const Node& a){ return a.x>=0&&a.x<r&&a.y>=0&&a.y<c&&a.z<100; } queue<Node> q; int main(){ ios_base::sync_with_stdio(false); cin>>t; while(t--){ cin>>r>>c>>k; for(int i=0;i<k;++i) cin>>pr[i]>>pc[i]>>qr[i]>>qc[i]>>dr[i]>>dc[i]; pretreatment(); q.push(Node(0,0,0)); while(!q.empty()){ node=q.front(); q.pop(); if(node.x==r-1&&node.y==c-1){ cout<<res[node.x][node.y][node.z]<<endl; flag=true; break; } for(int i=0;i<5;++i) if(judgeInBoard(Node(node.x+dx[i],node.y+dy[i],node.z+1))&&!board[node.x+dx[i]][node.y+dy[i]][node.z+1]&&!res[node.x+dx[i]][node.y+dy[i]][node.z+1]){ res[node.x+dx[i]][node.y+dy[i]][node.z+1]=res[node.x][node.y][node.z]+1; q.push(Node(node.x+dx[i],node.y+dy[i],node.z+1)); } } if(!flag) cout<<-1<<endl; } return 0; } void pretreatment(){ flag=false; while(!q.empty()) q.pop(); memset(res,0,sizeof res); memset(board,0,sizeof board); for(int i=0;i<k;++i){ int time=0; for(;judgeInBoard(Node(pr[i]+time*dr[i],pc[i]+time*dc[i],time))&&judgeInBoard(Node(qr[i]+time*dr[i],qc[i]+time*dc[i],time));++time) for(int ler=pr[i]+time*dr[i],rir=qr[i]+time*dr[i],lec=pc[i]+time*dc[i],ric=qc[i]+time*dc[i];ler<=rir;++ler) for(int tec=lec;tec<=ric;++tec) board[ler][tec][time]=true; --time; for(int ler=pr[i]+time*dr[i],rir=qr[i]+time*dr[i],lec=pc[i]+time*dc[i],ric=qc[i]+time*dc[i],k=time+1;k<100;++k) for(int ter=ler;ter<=rir;++ter) for(int tec=lec;tec<=ric;++tec) board[ter][tec][k]=board[ter][tec][time]; } }

    转载请注明原文地址: https://ju.6miu.com/read-36978.html

    最新回复(0)