POJ 3168 Barn Expansion (几何+排序)

来源:互联网 发布:jquery 遍历数组对象 编辑:程序博客网 时间:2024/05/01 21:51

题目链接:POJ 3168 Barn Expansion

题意:抽象出来就是给出n个矩形的坐标是(左下角和右上角的坐标,矩形的边都是平行x,y轴),问有几个矩形和其他矩形没有接触(只存在边接触或者点接触,不存在有公共面积)。

思路:把边分成两类,平行x轴和平行y轴。对边进行排序,然后for一遍判断是否有相交即可



AC代码:

#include <stdio.h>#include <vector>#include <map>#include <set>#include <algorithm>using namespace std;struct node {    int mark;    int d,xx,yy;    node() {}    node(int _d,int _xx,int _yy,int _mark) {        d=_d,xx=_xx,yy=_yy,mark=_mark;    }};vector<node> sx,sy;bool vis[25010];bool cmp(node a,node b) {    if(a.d!=b.d) return a.d<b.d;    else if(a.xx!=b.xx) return a.xx<b.xx;    else return a.yy<b.yy;}int main() {    int n;    int i,j,k;int a,b,c,d;    while(scanf("%d",&n)!=EOF) {        sx.clear();        sy.clear();memset(vis,false,sizeof vis);        for(i=0; i<n; i++) {            scanf("%d %d %d %d",&a,&b,&c,&d);            sy.push_back(node(b,a,c,i));            sy.push_back(node(d,a,c,i));            sx.push_back(node(a,b,d,i));            sx.push_back(node(c,b,d,i));        }        int sz1,sz2;        sz1=sy.size();        sz2=sx.size();        sort(sx.begin(),sx.end(),cmp);        sort(sy.begin(),sy.end(),cmp);        //竖 y<yyint up;up=sy[0].yy;        for(i=1;i<sz1;i++){if(sy[i-1].d == sy[i].d){if(up >= sy[i].xx){vis[sy[i].mark]=vis[sy[i-1].mark]=true;}}else up=sy[i].yy;up=max(sy[i].yy,up);        }up=sx[0].yy;for(i=1;i<sz2;i++){if(sx[i-1].d == sx[i].d){if(up >= sx[i].xx){vis[sx[i].mark]=vis[sx[i-1].mark]=true;}}else up=sx[i].yy;up=max(sx[i].yy,up);        }int ans=0;for(i=0;i<n;i++){if(!vis[i]) ans++;}printf("%d\n",ans);    }    return 0;}/*50 2 2 73 5 5 84 2 6 46 1 8 60 0 8 142 1 3 22 2 3 33 3 4 44 1 5 290 0 1 11 0 2 12 0 3 10 1 1 21 1 2 22 1 3 20 2 1 31 2 2 32 2 3 360 2 2 73 5 5 84 2 6 46 1 8 60 0 8 14 5 5 631 1 6 66 2 7 36 5 8 7*/


1 0
原创粉丝点击