题目大意就是给你一堆多边形,输出每个多变形相交的其他多边形的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;
}