本文主要是介绍HDU 5562 Clarke and five-pointed star (BC),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Clarke and five-pointed star
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/65536K (Java/Other)
Total Submission(s) : 8 Accepted Submission(s) : 2
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
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.
Input
For each test case, 5 lines follow. Each line contains 2 real numbers xi,yi(−109≤xi,yi≤109) , denoting the coordinate of this point.
Output
For each test case, print Yes if they can compose a five-pointed star. Otherwise, print No . (If 5 points are the same, print Yes . )
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
Source
分析:给出5个点的坐标,判断是否是一个正五角星
方法一:判断是正五角星,只需要判断是正五边形,因为输入的点是随机输入的,所以先把点按逆时针排一下序,然后再计算五边形的边是否相等即可。
方法二:把每个点到其他各点的距离求出来,排序,小的五条边是五边形的边,大的五条边是五边形的对角线。判断小的边相等,大的边相等即可。
代码如下(排序):
#include <stdio.h>
#include <math.h>
typedef struct node{double x,y;double k;
}Node;
Node ans[10],left[10],right[10];
double sumx,sumy;
void sort()
{//点的排序 int i,j;sumx=sumx/5.0;sumy=sumy/5.0;int le,ri;le=ri=0;for(i=0;i<5;i++){ans[i].k=(ans[i].y-sumy)/(ans[i].x-sumx);if(ans[i].x<=sumx)left[le++]=ans[i];elseright[ri++]=ans[i];}for(i=0;i<le-1;i++){for(j=i+1;j<le;j++){if(left[i].k > left[j].k){Node temp=left[i];left[i]=left[j];left[j]=temp;}}}for(i=0;i<ri-1;i++){for(j=i+1;j<ri;j++){if(right[i].k>right[j].k){Node temp=right[i];right[i]=right[j];right[j]=temp;}}}int num=0;for(i=0;i<le;i++)ans[num++]=left[i];for(i=0;i<ri;i++)ans[num++]=right[i];
}int main()
{int T;int i; scanf("%d",&T);while(T--){sumx=sumy=.0;for(i=0;i<5;i++){scanf("%lf %lf",&ans[i].x,&ans[i].y);sumx+=ans[i].x;sumy+=ans[i].y;}sort();double avg = sqrt((ans[0].x-ans[1].x)*(ans[0].x-ans[1].x)+(ans[0].y-ans[1].y)*(ans[0].y-ans[1].y));int peace=0;for(i=1;i<4;i++){double temp=sqrt((ans[i].x-ans[i+1].x)*(ans[i].x-ans[i+1].x)+(ans[i].y-ans[i+1].y)*(ans[i].y-ans[i+1].y));if(fabs(avg - temp)<=0.0001)continue;else{peace=1;break;}}if(!peace)printf("Yes\n");elseprintf("No\n");}return 0;
}
这篇关于HDU 5562 Clarke and five-pointed star (BC)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!