题目地址:http://acm.fzu.edu.cn/problem.php?pid=2035
其实这题也是一样的:http://acm.hdu.edu.cn/showproblem.php?pid=3902
题目意思也很好懂,就是处理如何判断多边行是否对称。
先找出所有点的中点,然后一共有2×N个点,依次检查是否关于XY的连线对称
如果存在对称轴,必定是点i和点i+n连成的直线,然后分别验证两边对称的点到点i和点i+n的距离是否相等
/*
判断n边形是否是轴对称图形:
n边形的n个顶点再加上n条边的中点,共2*n个顶点。
如果存在对称轴,必定是点i和点i+n连成的直线,然后分别验证两边对称的点
到点i和点i+n的距离是否相等
*/
#include<stdio.h>
#include<cmath>
using namespace std;
#define MAXN 20000
#define eps 1e-5
struct Node
{
double x,y;
}node[2*MAXN+10];
int n,m;
bool flag;//用来标注是否是轴对称图形
double dis(int i,int j)//求node[i]和node[j]的距离
{
double x=node[i].x-node[j].x;
double y=node[i].y-node[j].y;
return sqrt(x*x+y*y);
}
bool check(int i,int j,int x,int y)//检查node[i]和node[j]是否关于xy对称
//对称则dis(i,x)==dis(j,x)&&dis(i,y)==dis(j,y);
{
if(fabs(dis(i,x)-dis(j,x))>eps) return false;
if(fabs(dis(i,y)-dis(j,y))>eps) return false;
return true;
}
void ff(int x,int y)//判断node[x]和node[y]组成的直线是不是对称轴
{
int i,j;
i=j=x;
while(1)
{
i++;j--;
if(j==0) j=m;
if(i==y)
{
flag=true;
return;
}
if(check(i,j,x,y)==false) return;
}
}
int main()
{
//freopen("test.in","r",stdin);
//freopen("test.out","w",stdout);
int i;
while(~scanf("%d",&n))
{
m=2*n;
for(i=1;i<=m;i+=2)
{
scanf("%lf%lf",&node[i].x,&node[i].y);
}
node[m+1]=node[1];
for(i=2;i<=m;i+=2)
{
node[i].x=(node[i-1].x+node[i+1].x)/2;
node[i].y=(node[i-1].y+node[i+1].y)/2;
}
flag=false;
for(i=1;i<=n;i++)
{
ff(i,i+n);
if(flag) break;
}
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}