这是一道没有多少人做的水题,主要题目的要求比较多,对输入和输出的要求高,只要处理好输入输出,然后对每个多边形的每条边分别进行判断就能做出来了。
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
int ch[26];
struct point{
double x,y;
};
point polygon[26][22];
double Mul(point p1,point p2,point p) //叉积
{
return ((p1.x-p.x)*(p2.y-p.y)-(p2.x-p.x)*(p1.y-p.y));
}
bool iscross(point p1,point p2,point p3,point p4) //判断两条线段是否相交
{
return ((max(p1.x,p2.x)>=min(p3.x,p4.x)) && (min(p1.x,p2.x)<=max(p3.x,p4.x)) && (max(p1.y,p2.y)>=min(p3.y,p4.y)) && (min(p1.y,p2.y)<=max(p3.y,p4.y)) && (Mul(p3,p2,p1)*Mul(p2,p4,p1)>=0) && (Mul(p1,p4,p3)*Mul(p4,p2,p3)>=0));
}
void getp(point &p) //输入
{
scanf(" (%lf,%lf)",&p.x,&p.y); //注意前面有个空格
//printf("%lf %lf",p.x,p.y);
}
void init(int num,int tmp) //正常多边形的读入
{
ch[tmp]=num;
for(int i=0;i<num;i++)
getp(polygon[tmp][i]);
}
bool insert(int a,int b) //对每条边进行枚举,判断两多边形是否相交,边数等于顶点数
{
int i,j;
for(i=0;i<ch[a];i++)
for(j=0;j<ch[b];j++)
if(iscross(polygon[a][i],polygon[a][i+1],polygon[b][j],polygon[b][j+1]))
return true;
return false;
}
char ans[26];
void solve() //处理和输出
{
int i,j;
char tmp[10];
for(i=0;i<26;i++)
{
memset(ans,0,sizeof(ans));
memset(tmp,0,sizeof(tmp));
if(!ch[i])
continue;
printf("%c ",i+'A');
for(j=0;j<26;j++) //寻找相交的多边形
{
if(i==j || !ch[j])
continue;
if(insert(i,j))
{
tmp[0]=j+'A';
strcat(ans,tmp);
}
}
if(strlen(ans)==0) //分情况输出
printf("has no intersections\n");
else if(strlen(ans)==1)
printf("intersects with %s\n",ans);
else if(strlen(ans)==2)
printf("intersects with %c and %c\n",ans[0],ans[1]);
else
{
printf("intersects with %c",ans[0]);
for(j=1;j<strlen(ans)-1;j++)
printf(", %c",ans[j]);
printf(", and %c\n",ans[j]);
}
}
}
int main()
{
char s1[10],s2[10];
while(1)
{
scanf("%s",s1);
if(s1[0]=='.')
break;
memset(ch,0,sizeof(ch));
while(s1[0]!='-')
{
scanf("%s",s2);
int tmp=s1[0]-'A';
if(s2[0]=='l') //正常读入
init(2,tmp);
if(s2[0]=='t')
init(3,tmp);
if(s2[0]=='p')
{
int tt;
scanf("%d",&tt);
init(tt,tmp);
}
if(s2[0]=='r') //矩形要自己加一个点
{
ch[tmp]=4;
for(int i=0;i<3;i++)
getp(polygon[tmp][i]);
polygon[tmp][3].x=polygon[tmp][0].x+polygon[tmp][2].x-polygon[tmp][1].x;
polygon[tmp][3].y=polygon[tmp][0].y+polygon[tmp][2].y-polygon[tmp][1].y;
}
if(s2[0]=='s') //正方形通过中心点算出其余两个点
{
ch[tmp]=4;
getp(polygon[tmp][0]);
getp(polygon[tmp][2]);
polygon[tmp][1].x=(polygon[tmp][0].x+polygon[tmp][2].x)/2+(polygon[tmp][0].y-polygon[tmp][2].y)/2;
polygon[tmp][3].x=(polygon[tmp][0].x+polygon[tmp][2].x)/2+(polygon[tmp][2].y-polygon[tmp][0].y)/2;
polygon[tmp][1].y=(polygon[tmp][0].y+polygon[tmp][2].y)/2-(polygon[tmp][0].x-polygon[tmp][2].x)/2;
polygon[tmp][3].y=(polygon[tmp][0].y+polygon[tmp][2].y)/2-(polygon[tmp][2].x-polygon[tmp][0].x)/2;
}
scanf("%s",s1);
polygon[tmp][ch[tmp]]=polygon[tmp][0]; //将第一个点补到最后一个位置上方便处理
}
solve();
printf("\n");
/*for(int i=0;i<26;i++)
{
if(ch[i])
{
printf("%c",'A'+i);
for(int j=0;j<=ch[i];j++)
printf("(%.f %.f)",polygon[i][j].x,polygon[i][j].y);
printf("\n");
}
}*/
}
return 0;
}