您的位置:首页 > 大数据 > 人工智能

HDU 3902 Swordsman 2011 Multi-University Training Contest 7 - Host by ECNU 计算几何

2011-08-04 00:50 579 查看
/*
判断给定的多边形是不是轴对称图形
因为对称轴仅可能经过顶点或者边的终点
只需要枚举这些点能在o(n^2)的复杂度内解决
*/
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
#define N 40005
#define eps 1e-4;
struct node{
double x,y;
}p
;
int n,flag;
double dis(int i,int a)
{
return (p[i].x-p[a].x)*(p[i].x-p[a].x)+(p[i].y-p[a].y)*(p[i].y-p[a].y);
}

int main()
{
while(scanf("%d",&n)!=EOF)
{
flag=0;
for(int i=0;i<2*n;i=i+2)
{
scanf("%lf%lf",&p[i].x,&p[i].y);
if(i!=0)
{
p[i-1].x=(p[i].x+p[i-2].x)/2.0;
p[i-1].y=(p[i].y+p[i-2].y)/2.0;//拓展出边的中点
}
}
p[2*n-1].x=(p[0].x+p[2*n-2].x)/2.0;
p[2*n-1].y=(p[0].y+p[2*n-2].y)/2.0;
for(int i=0;i<n;i++)//枚举有可能在对称轴上的点
{
double x1=p[i].x-p[i+n].x;
double y1=p[i].y-p[i+n].y;
int k=i-1;
int j=i+1;
for(;j<i+n;j++,k--)//检查其他点是否关于此点对称
{
if(k<0)k=2*n-1;
double x2=p[j].x-p[k].x;
double y2=p[j].y-p[k].y;
if(x1*x2+y1*y2!=0)
break;
if(dis(i,j)!=dis(i,k))
break;
}
if(j==i+n)
{
flag=1;break;
}
}
if(flag)puts("YES");
else puts("NO");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐