题目地址: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; }