您的位置:首页 > 其它

FZU 2035

2014-03-06 22:22 330 查看
题意:给你顺时针或逆时针的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
=x[0];y
=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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: