poj3168 Barn Expansion【计算几何 平面扫描】

原创 2018年04月16日 21:02:04

Farmer John has N (1 <= N <= 25,000) rectangular barns on his farm, all with sides parallel to the X and Y axes and integer corner coordinates in the range 0..1,000,000. These barns do not overlap although they may share corners and/or sides with other barns. 

Since he has extra cows to milk this year, FJ would like to expand some of his barns. A barn has room to expand if it does not share a corner or a wall with any other barn. That is, FJ can expand a barn if all four of its walls can be pushed outward by at least some amount without bumping into another barn. If two barns meet at a corner, neither barn can expand. 

Please determine how many barns have room to expand.
Input
Line 1: A single integer, N 

Lines 2..N+1: Four space-separated integers A, B, C, and D, describing one barn. The lower-left corner of the barn is at (A,B) and the upper right corner is at (C,D).
Output
Line 1: A single integer that is the number of barns that can be expanded.
Sample Input
5
0 2 2 7
3 5 5 8
4 2 6 4
6 1 8 6
0 0 8 1
Sample Output
2
Hint
Explanation of the sample: 

There are 5 barns. The first barn has its lower-left corner at (0,2) and its upper-right corner at (2,7), and so on. 

Only two barns can be expanded --- the first two listed in the input. All other barns are each in contact with at least one other barn.

思路:

把四条边拆开 存到两个数组里

排序 y方向的先按照x排 再按照y方向上的起点排

x方向同理


遍历 对于每一个点 所有loc和他相同的 看看在不在重合范围内 并且更新范围

对于这个点本身的计数要特别一点 不然会重复



用cin cout会T 还是不长记性哦

可能真的痛经痛傻了 洗洗睡了洗洗睡了

#include <iostream>
#include <algorithm>
#include <cstring>

#include <cstdio>

#include <cmath>

using namespace std;
#define PI 3.1415926
#define EPS 1.0e-6



struct Point {
    Point(){}
    Point(double x, double y, double z):x(x), y(y), z(z){}
    double x,y, z;

};
struct rect{
    Point left_bottom;
    Point right_up;
};
struct barn{
    int index;
    int st, ed, loc;
}hh[500005], ll[500005];

bool cmp(barn a, barn b)
{
    if(a.loc == b.loc)
        return a.st < b.st;
    return a.loc < b.loc;
}




int n, ans;
rect rec[25005];
bool vis[25005];

void solve(barn *bar, int n)
{
    int i = 0;
    while(i < n){
        /*if(vis[bar[i].index]){
            i++;
            continue;
        }*/
        int pos = bar[i].loc;
        int cnt = 0;
        int first = i;
        int ed = bar[i].ed;
        i++;
        while(i < n && bar[i].loc == pos && bar[i].st <= ed){
            if(bar[i].ed > ed) ed = bar[i].ed;
            if(!vis[bar[i].index]){
                vis[bar[i].index] = true;
                ans--;
            }
            cnt++;
            i++;
        }
        if(cnt){
            if(!vis[bar[first].index]){
                vis[bar[first].index] = true;
                ans--;
            }

        }
    }
}

int main()
{
    //while(cin>>n){
    scanf("%d",&n);
        ans = n;
        //memset(vis, 0, sizeof(vis));
        for(int i = 0; i < n; i++){
            int left, bottom, right, up;
            scanf("%d%d%d%d",&left, &bottom, &right, &up);
            hh[2 * i].index = hh[2 * i + 1].index = i;
            ll[2 * i].index = ll[2 * i + 1].index = i;
            hh[2 * i].st = hh[2 * i + 1].st = bottom;
            hh[2 * i].ed = hh[2 * i + 1].ed = up;
            hh[2 * i].loc = left;hh[2 * i + 1].loc = right;
            ll[2 * i].st = ll[2 * i + 1].st = left;
            ll[2 * i].ed = ll[2 * i + 1].ed = right;
            ll[2 * i].loc = bottom; ll[2 * i + 1].loc = up;
        }

        sort(hh, hh + 2 * n, cmp);
        sort(ll, ll + 2 * n, cmp);
        solve(hh, 2 * n);
        solve(ll, 2 * n);
        //int ans = 0;
        //for(int i = 0; i < n; i++){
        //    if(!vis[i])ans++;
        //}
        printf("%d\n", ans);
    //}
    return 0;

}


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wybooooooooo/article/details/79966374

POJ 3168 Barn Expansion (平面扫描)

Barn Expansion Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2305   ...
  • aozil_yang
  • aozil_yang
  • 2016年07月29日 02:54
  • 234

poj 2932 计算几何入门题 平面扫描

链接:http://poj.org/problem?id=2932 题意: 有n个圆,给定每个圆的圆心和半径,求所有最外层的,即不包含在其他圆内部的圆。 (任意两圆都没有公共点) 思路: 由...
  • liujc_
  • liujc_
  • 2015年10月07日 15:07
  • 355

poj 3168 Barn Expansion 平面扫描+线段相交问题

http://poj.org/problem?id=3168题意:给你n个矩形,矩形之间只能是完全隔离或者刚好接触,且没有嵌套关系,判断这些矩形中不与其他任何矩形相接触的个数ac代码:#include...
  • smilesundream
  • smilesundream
  • 2017年05月20日 10:08
  • 54

ACM--计算几何--平面扫描

转自:点击打开链接如果图片打不开,请换高级浏览器,如谷歌,火狐浏览器等!!平面扫描思想在ACM竞赛中的应用Jan 1, 2013说明:以下为本科挫比的比赛论文,写文章的语气都是一副叫兽的调调!    ...
  • m0_37971327
  • m0_37971327
  • 2017年10月11日 09:39
  • 375

POJ 2932 —— 计算几何&&平面扫描

Coneology Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 2493   Accepted: 413 ...
  • zkzxmzk
  • zkzxmzk
  • 2013年10月26日 21:40
  • 510

计算几何:非规范相交的模板

计算几何:非规范相交的模板 int segcross(point a,point b,point c,point d) { double s1,s2,s3,s4; int d1,d2...
  • guoxianzhuang
  • guoxianzhuang
  • 2015年03月25日 17:54
  • 716

计算几何学习笔记之基本运算

模板在网上很容易找到,这里我就讲一讲我对这些代码(lrj白皮书上的)的理解,包括添加证明,插图等。 定义向量及向量的四则运算,其中A,B都是一个向量。(貌似是高中数学课本上的内容)...
  • cqbzwja
  • cqbzwja
  • 2016年03月31日 22:16
  • 454

计算几何之向量旋转

实际做题中我们可能会遇到很多有关及计算几何的问题,其中有一类问题就是向量的旋转问题,下面我们来具体探讨一下有关旋转的问题。 首先我们先把问题简化一下,我们先研究一个点绕另一个点旋转一定角度的问题...
  • u013445530
  • u013445530
  • 2015年04月06日 18:11
  • 1862

计算几何的模板(大神整理)

计算几何模板 目录: 1.计算几何 2 1.1 注意 2 1.2几何公式 2 1.3 多边形 4 1.4多边形切割 7 1.5 浮点函数 8 1.6 面积 14 1.7球面 15 ...
  • clasky
  • clasky
  • 2013年08月15日 21:26
  • 5344

poj 3168 Barn Expansion 排序

把每个横坐标边,纵坐标边分别排序,判断是否相邻即可。 #include #include #include #include using namespace std; const int...
  • yrleep
  • yrleep
  • 2013年10月04日 19:25
  • 1075
收藏助手
不良信息举报
您举报文章:poj3168 Barn Expansion【计算几何 平面扫描】
举报原因:
原因补充:

(最多只允许输入30个字)