FZU 2035

来源:互联网 发布:eplan软件界面 编辑:程序博客网 时间:2024/04/30 07:18


题意:给你顺时针或逆时针的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 510map<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;}


0 0
原创粉丝点击