POJ 2318 / 2389 几何入门题

来源:互联网 发布:nagle算法作用 编辑:程序博客网 时间:2024/05/17 22:56

题目链接:  POJ 2318 TOYS

           POJ 2398 Toy Storage

代码:

POJ  2318

#include <stdio.h>#include <cstring>#include <iostream>using namespace std;const int maxn=5555;double x1,x2,y1,y2;int n,m;struct point {    double x,y;    void read(double a,double b){        x=a; y=b;    }};struct segment {    point a, b;    void read(double c,double d){        a.read(c,y1); b.read(d,y2);    }}L[maxn];int num[maxn];double cross(point A,point B,point C){    return (B.x-A.x)*(C.y-A.y)-(C.x-A.x)*(B.y-A.y);}int main(){    while(~scanf("%d",&n)&&n){        memset(num,0,sizeof(num));        scanf("%d%lf%lf%lf%lf",&m,&x1,&y1,&x2,&y2);        for(int i=1;i<=n;++i){            double c,d;             scanf("%lf%lf",&c,&d);            L[i].read(c,d);        }        while(m--){            double u,v; scanf("%lf%lf",&u,&v);            point p; p.read(u,v);            if(u<x1||u>x2||v<y2||v>y1) continue; ///дкЧјгђЭт            int i=1;            while(i<=n){                double s=cross(L[i].b, p, L[i].a);                if(s<0)break;                ++i;            }            num[i-1]++;        }        for(int i=0;i<=n;++i)            printf("%d: %d\n",i,num[i]);        puts("");    }    return 0;}



POJ  2389

#include <stdio.h>#include <cstring>#include <iostream>#include<algorithm>using namespace std;const int maxn=5555;double x1,x2,y1,y2;int n,m;struct point {    double x,y;    void read(double a,double b){        x=a; y=b;    }};struct segment {    point a, b;    void read(double c,double d){        a.read(c,y1); b.read(d,y2);    }}L[maxn];int num[maxn],ans[maxn];bool cmp(segment s1, segment s2){    return s1.a.x<s2.a.x;}double cross(point A,point B,point C){    return (B.x-A.x)*(C.y-A.y)-(C.x-A.x)*(B.y-A.y);}int main(){    while(~scanf("%d",&n)&&n){        memset(num,0,sizeof(num));        scanf("%d%lf%lf%lf%lf",&m,&x1,&y1,&x2,&y2);        for(int i=1;i<=n;++i){            double c,d;             scanf("%lf%lf",&c,&d);            L[i].read(c,d);        }        sort(L+1,L+n+1,cmp);        while(m--){            double u,v; scanf("%lf%lf",&u,&v);            point p; p.read(u,v);            if(u<x1||u>x2||v<y2||v>y1) continue; ///дкЧјгђЭт            int i=1;            while(i<=n){                double s=cross(L[i].b, p, L[i].a);                if(s<0)break;                ++i;            }            num[i-1]++;        }        sort(num,num+n+1);        puts("Box");        int i=0;        while(num[i]==0)++i;        int c=num[i],k=0;        for( ;i<=n+1;++i){            if(i==n+1||num[i]!=c){                printf("%d: %d\n",c,k);                k=1; c=num[i];                if(c==0) break;            }            else ++k;        }    }    return 0;}