Clarke and five-pointed star
Accepts: 237
Submissions: 591
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
问题描述
克拉克是一名人格分裂患者。某一天克拉克分裂为一个几何学习者,在研究多边形。 在研究某一个多边形的时候,克拉克发现他多次遇到判断5个点是否能组成一个五角星的问题,在这里,这5个点分别代表五角星的五个顶点(顶角上的点)。于是他跑来想你求助,让你写出一个程序快速判定。即对于给出的5个点,判断这5个点是否能组成一个五角星。
输入描述
第一行一个整数T(1≤T≤10),表示数据的组数。 每组数据有5行,每行有两个实数xi,yi(−109≤xi,yi≤109),表示第i个点的坐标。
输出描述
如果两个量相差小于10−4,则认为这两个量相等。 对于每组数据,如果这5个点能组成一个五角星,则输出Yes,否则输出No。(如果5个点相同,那么也能组成一个五角星。)
输入样例
2 3.0000000 0.0000000 0.9270509 2.8531695 0.9270509 -2.8531695 -2.4270509 1.7633557 -2.4270509 -1.7633557 3.0000000 1.0000000 0.9270509 2.8531695 0.9270509 -2.8531695 -2.4270509 1.7633557 -2.4270509 -1.7633557
输出样例
Yes No
Hint
样例1如图 样例2如图
这题其实就是判断这五个点是否可以组成一个正五边形,所以每一个点到另外四个点的边肯定是有四条边中肯定有两两是相等的边,所以存在2个。所以遍历五个点后,必然是10个两两相等的边。最后以为重测肯定会错了,因为5个点相同未考虑,好在五个点相同的不算是五角星。
AC代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<string> #include<cmath> #include<vector> typedef long long ll; using namespace std; #define T 100005 struct node { double x,y; }a[5]; double solve(node& a,node& b) { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } int main() { #ifdef zsc freopen("input.txt","r",stdin); #endif int N,i,j,cnt,c; bool flag; scanf("%d",&N); while(N--) { flag = true; for(i=0;i<5;++i){ scanf("%lf%lf",&a[i].x,&a[i].y); } double v[5];cnt=0; for(i=0;i<5;++i){ c=0; for(j=0;j<5;++j){ if(i!=j) v[c++] = solve(a[i],a[j]); } sort(v,v+c); for(j=1;j<c;++j){ if(v[j]-v[j-1]<0.0001){ cnt++; } } } if(cnt==10){ printf("Yes\n"); } else { printf("No\n"); } } return 0; }