zoukankan      html  css  js  c++  java
  • BZOJ 2541: [Ctsc2000]冰原探险

    Descrption

    有一些矩形障碍,碰到障碍会停下,求从一个点到另一个点的最少移动步数.

    Sol

    BFS.

    因为题目的特殊性质,两个矩形没有任何相邻,起始点和终点和矩形没有相邻.

    所以从一个点的移动只有 左/右 或 上/下两种可能,与它到该点的方向不同,不然就又移动回去了.

    然后可以在边BFS的时候边建图,往上/下 或 左/右 找能限制住他的矩阵.

    复杂度 (O(n^2))

    Code

    /**************************************************************
        Problem: 2541
        User: BeiYu
        Language: C++
        Result: Accepted
        Time:148 ms
        Memory:1420 kb
    ****************************************************************/
     
    #include<cstdio>
    #include<queue>
    #include<iostream>
    using namespace std;
     
    const int N = 4050;
    const int INF = 1e9;
     
    int n,sx,sy,tx,ty;
    int x1[N],y1[N],x2[N],y2[N],vis[N<<2];
    struct S{ int r,x,y,d; };
    queue< S > q;
    //U 0 D 1 L 2 R 3
     
    inline int in(int x=0,char ch=getchar(),int v=1){
        while(ch!='-' && (ch>'9' || ch<'0')) ch=getchar();if(ch == '-') v=-1,ch=getchar();
        while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*v; }
    int main(){
        n=in(),sx=in(),sy=in(),tx=in(),ty=in();
        for(int i=1;i<=n;i++) x1[i]=in(),y1[i]=in(),x2[i]=in(),y2[i]=in();
        for(q.push((S){ 0,sx,sy,0 }),q.push((S){ 1,sx,sy,0 });!q.empty();){
            int mx=-INF,mi=INF,p1=0,p2=0;
            int rr=q.front().r,xx=q.front().x,yy=q.front().y,dd=q.front().d;
            q.pop();
            if(rr){//Move to Up/Down
                for(int i=1;i<=n;i++) if(x1[i]<=xx && xx<=x2[i]){
                    if(y1[i]>yy && y1[i]<mi) mi=y1[i],p1=i;
                    if(y2[i]<yy && y2[i]>mx) mx=y2[i],p2=i;
                }
                if(p1 && !vis[p1<<2]) vis[p1<<2]=1,q.push((S){ 0,xx,mi-1,dd+1 });
                if(p2 && !vis[p2<<2|1]) vis[p2<<2|1]=1,q.push((S){ 0,xx,mx+1,dd+1 });
                if(xx==tx && mx<=ty && ty<=mi) return printf("%d
    ",dd+1),0;
            }else{//Move to Left/Right
                for(int i=1;i<=n;i++) if(y1[i]<=yy && yy<=y2[i]){
                    if(x1[i]>xx && x1[i]<mi) mi=x1[i],p1=i;
                    if(x2[i]<xx && x2[i]>mx) mx=x2[i],p2=i;
                }
                if(p1 && !vis[p1<<2|2]) vis[p1<<2|2]=1,q.push((S){ 1,mi-1,yy,dd+1 });
                if(p2 && !vis[p2<<2|3]) vis[p2<<2|3]=1,q.push((S){ 1,mx+1,yy,dd+1 });
                if(yy==ty && mx<=tx && tx<=mi) return printf("%d
    ",dd+1),0;
            }
        }return printf("%d
    ",0),0;
    }
    

      

  • 相关阅读:
    sharepoint获取通用路径
    Sharepoint 在网站中创建用户组并添加权限
    ERP失败案例启示录:人是最关键的
    人生主要过渡期
    Windows Server 2012虚拟化性能及十大重要功能
    抢先看:iPhone5整机完整亮相
    未来五年10大关键IT趋势
    [转]完善的资产管理:实现以可靠性为中心的维护管理
    如何摆脱ERP困局
    项目经理的“七宗罪”
  • 原文地址:https://www.cnblogs.com/beiyuoi/p/6060581.html
Copyright © 2011-2022 走看看