poj 3449 Geometric Shapes

来源:互联网 发布:网络平台维护费 编辑:程序博客网 时间:2024/06/05 09:35

求各种图形的相交问题,简化到求线段相交问题。

WA了一次,原因是叉积相乘超出了int范围,以后要注意!

 

#include<iostream>#include<cstring>#include<cstdio>#include<cmath>#include<algorithm>using namespace std;char str[30][3], ans[30];int n;struct Point{    int x, y;    Point operator +(Point p1)const{        p1.x+=x;p1.y+=y;        return p1;    }    Point operator -(Point p1)const{        p1.x=x-p1.x;p1.y=y-p1.y;        return p1;    }};struct Segline{Point s, e;};struct node{    char name;    int cnt;    Point p[25];}a[30];Point getpoint(){    char ss[20];    Point pt;    scanf("%s", ss);    sscanf(ss, "%*c%d%*c%d%*c", &pt.x, &pt.y);    return pt;}void read(){    a[n].name=str[n][0];    char ss[20];    scanf("%s", ss);    if(strcmp(ss, "square")==0){        a[n].cnt=4;        a[n].p[0]=getpoint();        a[n].p[2]=getpoint();        a[n].p[1].x=(a[n].p[0].x+a[n].p[2].x+a[n].p[2].y-a[n].p[0].y)/2;        a[n].p[1].y=(a[n].p[0].y+a[n].p[2].y+a[n].p[0].x-a[n].p[2].x)/2;        a[n].p[3].x=(a[n].p[0].x+a[n].p[2].x-a[n].p[2].y+a[n].p[0].y)/2;        a[n].p[3].y=(a[n].p[0].y+a[n].p[2].y-a[n].p[0].x+a[n].p[2].x)/2;    }    else if(strcmp(ss, "rectangle")==0){        a[n].cnt=4;        a[n].p[0]=getpoint();        a[n].p[1]=getpoint();        a[n].p[2]=getpoint();        a[n].p[3]=a[n].p[0]+a[n].p[2]-a[n].p[1];    }    else if(strcmp(ss, "line")==0){        a[n].cnt=2;        a[n].p[0]=getpoint();        a[n].p[1]=getpoint();    }    else if(strcmp(ss, "triangle")==0){        a[n].cnt=3;        a[n].p[0]=getpoint();        a[n].p[1]=getpoint();        a[n].p[2]=getpoint();    }    else if(strcmp(ss, "polygon")==0){        scanf("%d", &a[n].cnt);        for(int i=0; i<a[n].cnt; i++)        a[n].p[i]=getpoint();    }}void init(){    read();    n=1;    while(scanf("%s", str[n])&&str[n][0]!='-'){        read();        n++;    }}bool cmp(node a1, node a2){    return a1.name<a2.name;}long long x_mult(Point sp, Point ep, Point op){    return (long long)(sp.x-op.x)*(ep.y-op.y)-(long long)(sp.y-op.y)*(ep.x-op.x);}bool online(Point p1, Point p2, Point p3, Point p4){    if(max(p1.x,p2.x)<min(p3.x,p4.x)||max(p1.y,p2.y)<min(p3.y, p4.y)||       min(p1.x,p2.x)>max(p3.x,p4.x)||min(p1.y,p2.y)>max(p3.y, p4.y))       return false;       return true;}bool x_segline(Segline s1, Segline s2){    if(online(s1.s,s1.e,s2.s,s2.e)&& x_mult(s1.e, s2.s, s1.s)*x_mult(s1.e, s2.e, s1.s)<=0&&        x_mult(s2.e, s1.s, s2.s)*x_mult(s2.e, s1.e, s2.s)<=0)            return true;        return false;}bool check(node a1, node a2){    Segline seg1, seg2;    a1.p[a1.cnt]=a1.p[0];a2.p[a2.cnt]=a2.p[0];    for(int i=0; i<a1.cnt; i++){        seg1.s=a1.p[i];seg1.e=a1.p[i+1];        for(int j=0; j<a2.cnt; j++){            seg2.s=a2.p[j];seg2.e=a2.p[j+1];            if(x_segline(seg1, seg2))                return true;        }    }    return false;}void solve(){    sort(a, a+n, cmp);    for(int i=0; i<n; i++){        int res=0;        for(int j=0; j<n; j++){            if(j==i)continue;            if(check(a[i], a[j])){                ans[res++]=a[j].name;            }        }        if(res==0)            printf("%c has no intersections\n", a[i].name);        else if(res==1)            printf("%c intersects with %c\n", a[i].name, ans[0]);        else if(res==2)            printf("%c intersects with %c and %c\n", a[i].name, ans[0], ans[1]);        else {            printf("%c intersects with ", a[i].name);            for(int k=0; k<res-1; k++)            printf("%c, ", ans[k]);            printf("and %c\n", ans[res-1]);        }    }    printf("\n");}int main(){    //freopen("1.txt", "r", stdin);    n=0;    while(scanf("%s", str[0])&&str[0][0]!='.'){        init();        solve();        n=0;    }    return 0;}


 

原创粉丝点击