zoukankan      html  css  js  c++  java
  • FZU2235 国王的出游 水题

    因为只有1e5个点,所以直接离散化bfs就好

    #include <cstdio>
    #include <cstring>
    #include <queue>
    #include <set>
    #include <map>
    #include <stack>
    #include <cstdlib>
    #include <algorithm>
    #include <vector>
    #include <cmath>
    using namespace std;
    typedef long long LL;
    typedef pair<int,int>pii;
    const int N=1e5+5;
    const int INF=0x3f3f3f3f;
    const int mod=1000000007;
    pii p[N],tmp;
    int dx[8]={-1,-1,-1,0,0,1,1,1};
    int dy[8]={-1,0,1,-1,1,-1,0,1};
    int head[N],tot,d[N],cnt;
    struct Edge{
      int v,next;
    }edge[8*N];
    void add(int u,int v){
        edge[tot].v=v;
        edge[tot].next=head[u];
        head[u]=tot++;
    }
    queue<int>q;
    int get(int s,int t){
       while(!q.empty())q.pop();
       memset(d,-1,sizeof(d));
       d[s]=0;q.push(s);
       while(!q.empty()){
        int u=q.front();
        q.pop();
        if(u==t)return d[t];
        for(int i=head[u];~i;i=edge[i].next){
            int v=edge[i].v;
            if(d[v]==-1)d[v]=d[u]+1,q.push(v);
        }
       }
       return -1;
    }
    int main(){
        int x1,x2,y1,y2,n,s,t;
        while(~scanf("%d%d%d%d",&x1,&y1,&x2,&y2)){
           scanf("%d",&n);
           memset(head,-1,sizeof(head)),cnt=tot=0;
           for(int i=1;i<=n;++i){
              int x,l,r;
              scanf("%d%d%d",&x,&l,&r);
              for(int j=l;j<=r;++j)
                ++cnt,p[cnt].first=x,p[cnt].second=j;
           }
           sort(p+1,p+1+cnt);
           cnt=unique(p+1,p+1+cnt)-p-1;
           for(int i=1;i<=cnt;++i){
              for(int j=0;j<8;++j){
                tmp.first=p[i].first+dx[j];
                tmp.second=p[i].second+dy[j];
                int pos=lower_bound(p+1,p+1+cnt,tmp)-p;
                if(pos==cnt+1||p[pos].first!=tmp.first||p[pos].second!=tmp.second)
                    continue;
                add(i,pos);
              }
           }
           tmp.first=x1,tmp.second=y1;
           s=lower_bound(p+1,p+1+cnt,tmp)-p; 
           tmp.first=x2,tmp.second=y2;
           t=lower_bound(p+1,p+1+cnt,tmp)-p;
           printf("%d
    ",get(s,t));
        }
        return 0;
    }
    View Code
  • 相关阅读:
    es5
    总有你用的上插件
    三级联动
    jquery快速入门
    动态创建数据table
    背景裁切
    移动web-bootstrap
    ionic开发之Android可以很快打开主页,iOS要几分钟打开主页
    .Net语言 APP开发平台——Smobiler学习日志:如何在手机上快速实现CandleStickChart控件
    .Net语言 APP开发平台——Smobiler学习日志:如何快速实现Timer计时功能
  • 原文地址:https://www.cnblogs.com/shuguangzw/p/5458832.html
Copyright © 2011-2022 走看看