题意:给你顺时针或逆时针的n个点,问这n个点组成的多边形是否轴对称。。。
思路:枚举对称轴,找到则跳出
对称轴:可能在在的中垂线上,也有可能在顶点上。
对于每条对称轴,找到每个点的对称点,若对称点都存在,则输出yes,否则为no。
#include<cstdio> #include<stdlib.h> #include<string.h> #include<string> #include<cmath> #include<iostream> #include <queue> #include <stack> #include<algorithm> #include<map> using namespace std; #define INF 1e8 #define inf -0x3f3f3f3f #define eps 1e-8 #define ll __int64 #define mol 100007 #define maxn 510 map<double,map<double,int> >G; int n; double x[maxn],y[maxn]; bool pd(double xx,double yy,double k,int vis) { double cnt,temp,a,b; for(int i=0;i<n;i++)//对于每个点找到它的对称点 { if(vis==2) { b=y[i]; a=(xx-x[i])*2+x[i]; } else if(vis==1) { a=x[i]; b=(yy-y[i])*2+y[i]; } else { b=(2*(yy-k*xx)+y[i]*(k*k-1)+2*k*x[i])/(k*k+1); a=-k*(b-y[i])+x[i]; } if(G[a][b])// 是否存在 continue; else return false; } return true; } int main() { int t,Case=1; int i,j; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i=0;i<n;i++) { scanf("%lf%lf",&x[i],&y[i]); G[x[i]][y[i]]=1; } x[n]=x[0];y[n]=y[0]; double k,x0,y0; int flag=0,vis=0; for(i=0;i<n;i++)//对称轴在边上 { vis=0; k=-(x[i+1]-x[i])/(y[i+1]-y[i]); if(x[i+1]-x[i]==0) vis=1; if(y[i+1]-y[i]==0) vis=2; x0=(x[i+1]+x[i])/2; y0=(y[i+1]+y[i])/2; if(pd(x0,y0,k,vis)) { flag=1; break; } } vis=0; if(!flag) { for(i=0;i<n/2;i++)//对称轴在顶点上 { vis=0; k=(y[i+n/2]-y[i])/(x[i+n/2]-x[i]); if(x[i+n/2]-x[i]==0) vis=1; if(y[i+n/2]-y[i]==0) vis=2; x0=(x[i+n/2]+x[i])/2; y0=(y[i+n/2]+y[i])/2; if(pd(x0,y0,k,vis)) { flag=1; break; } } } printf("Case %d: ",Case++); if(flag) printf("YES\n"); else printf("NO\n"); } return 0; }