1. 程式人生 > >Clarke and five-pointed star

Clarke and five-pointed star

using wid sam poi tput test case -1 out sin

Clarke is a patient with multiple personality disorder. One day, Clarke turned into a learner of geometric.
When he did a research with polygons, he found he has to judge if the polygon is a five-pointed star at many times. There are 5 points on a plane, he wants to know if a five-pointed star existed with 5 points given.

InputThe first line contains an integer

T(1T10)T(1≤T≤10), the number of the test cases.
For each test case, 5 lines follow. Each line contains 2 real numbers xi,yi(?109xi,yi109)xi,yi(?109≤xi,yi≤109), denoting the coordinate of this point.
OutputTwo numbers are equal if and only if the difference between them is less than 10?410?4.
For each test case, print
YesYes if they can compose a five-pointed star. Otherwise, print NoNo. (If 5 points are the same, print YesYes. )
Sample Input

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

Sample Output

Yes
No


        
 

Hint技術分享技術分享

我想了下,感覺這道題做法很多啊,判邊判點的,但是一想還是覺得判邊比較輕松,只要考率裏面五條邊相等,外面五條邊相等就好了

#include<bits/stdc++.h>
using namespace std;
int main() {
    int T,i,j;
    double x[5],y[5],a[15];
    scanf("%d",&T);
    while(T--) {
        for(i=0; i<5; i++)
            scanf("%lf%lf",&x[i],&y[i]);
        int t=0,f=1;
        for(i=0; i<5; i++)
        for(j=0; j<i; j++)
        a[t++]=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);
        sort(a,a+t);
        for(i=0; i<9; i++)
            if(i!=4&&fabs(a[i]-a[i+1])>0.0001) f=0;
        printf("%s\n",f?"Yes":"No");
    }
    return 0;
}

Clarke and five-pointed star