• FZU 2235


    中文题,题意略。

    这个题点少坐标范围大,直接离散化后建图搞。

    这个题目卡vector,真是一脸懵逼。。。。。。。。。。。。

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<queue>
    #define maxn 100050
    #define F 0x3f
    #define INF 0x3f3f3f3f
    using namespace std;
    
    struct Point{
        int x,y;
        Point(int a = 0,int b = 0){
            x = a,y = b;
        }
        Point operator+ (const Point& p){
            return Point(p.x + x,p.y + y);
        }
        bool operator< (const Point& p) const{
            if(p.x != x) return x < p.x;
            else return y < p.y;
        }
        bool operator == (const Point& p) const{
            return (x == p.x) && (y == p.y);
        }
    };
    struct Edge{
        int to,nxt;
    };
    
    Edge edge[maxn<<3];
    int head[maxn];
    Point p1,p2;
    Point mov[] = {Point(1,0),Point(-1,0),Point(0,1),Point(0,-1),Point(1,1),Point(-1,1),Point(-1,-1),Point(1,-1)};
    Point store[maxn];
    int N,tail,cnt;
    int dist[maxn];
    
    int bfs(int s,int t){
        memset(dist,F,sizeof(dist));
        queue<int> que;
        que.push(s);
        dist[s] = 0;
        while(que.size()){
            //printf("i cannot out
    ");
            int temp = que.front();
            que.pop();
            for(int i = head[temp];i != -1;i = edge[i].nxt){
                int v = edge[i].to;
                //printf("i == %d
    ",i);
                if(dist[v] != INF) continue;
                if( dist[v] > dist[temp] + 1){
                    dist[v] = dist[temp] + 1;
                    que.push(v);
                }
            }
        }
        return dist[t];
    }
    void add_e(int from,int to){
        edge[cnt].to = to,edge[cnt].nxt = head[from],head[from] = cnt++;
    }
    void init(){
        memset(head,-1,sizeof(head));
        cnt = tail = 0;
    }
    
    int main(){
        while(scanf("%d%d%d%d",&p1.x,&p1.y,&p2.x,&p2.y) == 4){
            init();
            scanf("%d",&N);
            int ri,ai,bi;
            store[tail++] = p1,store[tail++] = p2;
            for(int i = 0;i < N;++i){
                scanf("%d%d%d",&ri,&ai,&bi);
                for(int j = ai;j <= bi;++j){
                    store[tail++] = Point(ri,j);
                }
            }
            sort(store,store + tail);
            tail = unique(store,store + tail) - store;
            for(int i = 0;i < tail;++i){
                int id1 = i + 1;
                //printf("from (%d,%d):
    ",store[i].x,store[i].y);
                for(int j = 0;j < 8;++j){
                    Point temp = store[i] + mov[j];
                    int id2 = lower_bound(store,store + tail,temp) - store + 1;
                    if(!(store[id2 - 1] == temp)) continue;
                    //printf("to (%d,%d)
    ",temp.x,temp.y);
                    add_e(id1,id2);
                }
            }
            int s = lower_bound(store,store + tail,p1) - store + 1;
            int t = lower_bound(store,store + tail,p2) - store + 1;
            int ans = bfs(s,t);
            printf("%d
    ",ans == INF ? -1 : ans);
        }
        return 0;
    }
  • 相关阅读:
    QT中文报错问题
    自动获取UILabel高度
    vi编辑器的使用
    命令例子
    WPF中textBlock 变色功能
    php 删除目录及子文件
    jquery autocomplete插件
    js日历选择控件
    centeros bash: ifconfig: command not found
    php 文件日志类
  • 原文地址:https://www.cnblogs.com/tiberius/p/8495917.html
Copyright © 2020-2023  润新知