POJ 3449 Geometric Shapes

3449

题目大意就是给你一堆多边形,输出每个多变形相交的其他多边形的name。

恶心的输入输出格式。

实际上考察的是线段的相交问题。

注意小心就不会出错了。

代码居然有5+K,额。。。

CODE:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>

using namespace std;
#define FOR(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define DOR(i,a,b) for(int (i)=(a);(i)>=(b);(i)--)
#define oo 1e6
#define eps 1e-5
#define nMax 1000
#define pb push_back
#define bug puts("OOOOh.....");
#define zero(x) (((x)>0?(x):-(x))<eps)

double const pi = acos(-1.0);

int dcmp(double x){
    if(fabs(x)<eps) return 0;
    return x>0?1:-1;
}
class point {
public:
    double x,y;
    point (double x=0,double y=0):x(x),y(y) {}
    void make(double _x,double _y) {x=_x;y=_y;}
    void read() {
        char s[20];
        scanf("%s",s);
        sscanf(s,"(%lf,%lf)",&x,&y);
        //scanf("(%lf,%lf)",&x,&y);
    }
    void out() { printf("(%.2lf,%.2lf) ",x,y);}
    double len() { return sqrt(x*x+y*y); }
    point friend operator - (point const& u,point const& v) {
        return point(u.x-v.x,u.y-v.y);
    }
    point friend operator + (point const& u,point const& v) {
        return point(u.x+v.x,u.y+v.y);
    }
    double friend operator * (point const& u,point const& v) {
        return u.x*v.y-u.y*v.x;
    }
    double friend operator ^ (point const& u,point const& v) {
        return u.x*v.x+u.y*v.y;
    }
    point friend operator * (point const& u,double const& k) {
        return point(u.x*k,u.y*k);
    }
    point friend operator / (point const& u,double const& k) {
        //assert(u.x/k);
        return point(u.x/k,u.y/k);
    }
    point friend rotate(point p,double theta){
        point ret;
        ret.x=p.x*cos(theta)+p.y*sin(theta);
        ret.y=-p.x*sin(theta)+p.y*cos(theta);
        return ret;
    }
};
typedef class line{
public:
    point a,b;
    line() {}
    line (point a,point b):a(a),b(b){}
    void make(point u,point v) {a=u;b=v;}
    void read() { a.read(),b.read(); }
}segment;
int sameside(line l,point u,point v){
    return dcmp((l.a-u)*(u-l.b))*dcmp((l.a-v)*(v-l.b)) > 0;
}
int dots_online(point a,point b,point c){
    return dcmp((a-b)*(b-c)) == 0;
}
int dot_in_line(line l,point u){
    return dcmp((l.a-u)*(u-l.b))==0 && (l.a.x-u.x)*(u.x-l.b.x)>eps && dcmp((l.a-u)^(u-l.b))>=0;
}
int intersection(line u,line v){
    if(!dots_online(u.a,u.b,v.a) || !dots_online(u.a,u.b,v.b))
        return !sameside(u,v.a,v.b) && !sameside(v,u.a,u.b);
    else
        return dot_in_line(u,v.a) || dot_in_line(u,v.b) || dot_in_line(v,u.a) || dot_in_line(v,u.b);
}
typedef class polygon{
public:
    int n;
    char name[20],type[20];
    vector<line> l;
    void make(char * );
    friend bool operator < (polygon const& u,polygon const& v){
        return strcmp(u.name,v.name) < 0;
    }
    void out(){
        printf("name=%s type=%s number=%d\n",name,type,n);
        for(int i=0;i<n;i++) l[i].a.out();
        printf("\n");
    }
} Polygon;

polygon a[nMax];
char s[20];
point p[nMax];
vector<int> ans[nMax];

void Polygon::make(char* na){
    scanf("%s",s);
    strcpy(type,s);strcpy(name,na);
    if(strcmp(s,"square")==0){
        n=4;
        for(int i=0;i<2;i++) p[i].read();
        point mid = (p[0]+p[1])/2.0;
        point p1=rotate(p[1]-mid,pi/2.0),p2=rotate(p[1]-mid,-pi/2.0);
        p1 = p1+mid,p2=p2+mid;
        l.clear();
        l.pb(line(p[0],p1));l.pb(line(p1,p[1]));
        l.pb(line(p[1],p2));l.pb(line(p2,p[0]));
    }else if(strcmp(s,"rectangle")==0){
        n=4;
        for(int i=0;i<3;i++) p[i].read();
        point mid = (p[0]+p[2])/2.0;
        point p1=rotate(p[1]-mid,pi);
        p1 = p1+mid;
        l.clear();
        l.pb(line(p[0],p[1])),l.pb(line(p[1],p[2]));
        l.pb(line(p[2],p1))  ,l.pb(line(p1,p[0]))  ;
    }else if(strcmp(s,"line")==0){
        n=1;
        for(int i=0;i<2;i++) p[i].read();
        l.clear();
        l.pb(line(p[0],p[1]));
    }else if(strcmp(s,"triangle")==0){
        n=3;l.clear();
        for(int i=0;i<3;i++) p[i].read();
        for(int i=0;i<3;i++) l.pb(line(p[i],p[(i+1)%3]));
    }else if(strcmp(s,"polygon")==0){
        scanf("%d",&n);l.clear();
        for(int i=0;i<n;i++) p[i].read();
        for(int i=0;i<n;i++) l.pb(line(p[i],p[(i+1)%n]));
    }
}
int intersection(Polygon u,Polygon v){
    for(int i=0;i<u.n;i++) for(int j=0;j<v.n;j++) {
        if(intersection(u.l[i],v.l[j])) return 1;
    }
    return 0;
}

void sovle(int n){
    sort(a,a+n);
    //for(int i=0;i<n;i++) a[i].out();
    for(int i=0;i<n;i++) ans[i].clear();
    for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(i!=j && intersection(a[i],a[j])) ans[i].pb(j);
    for(int i=0;i<n;i++) if(ans[i].size()==0) printf("%s has no intersections\n",a[i].name);
    else {
        printf("%s intersects with",a[i].name);
        if(ans[i].size()==1) printf(" %s\n",a[ans[i][0]].name);
        if(ans[i].size()==2) printf(" %s and %s\n",a[ans[i][0]].name,a[ans[i][1]].name);
        if(ans[i].size()>=3) {
            printf(" ");
            for(int j=0;j<ans[i].size()-1;j++) printf("%s, ",a[ans[i][j]].name);
            printf("and %s\n",a[ans[i][ans[i].size()-1]].name);
        }
    }
    printf("\n");
    return ;
}
int main(){
#ifndef ONLINE_JUDGE
    freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
#endif
    int n=0;
    char na[nMax];
    while(1){
        scanf("%s",na);
        if(na[0]=='-') {
            sovle(n);
            n=0;
            continue;
        }
        if(na[0]=='.') break;
        a[n++].make(na);
        //a[n-1].out();
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值