首页 > 代码库 > poj1971Parallelogram Counting
poj1971Parallelogram Counting
题意:给定平面上的n个点,求这n个点中能构成平行四边形的个数。
保证不会有四个点在同一条直线上。
解题思路:由于平行四边形的两条对角线交于一点,且该点为两对角线的中点。若两线段的中点是同一个点,则这两条线段的四个顶点一定可以构成一个平行四边形!
所以可以求所有线段的中点,然后根据相同中点的个数来判断平行四边形的个数。如果一个点重复了k次,则形成的平行四边形的个数为k(k-1)/2.
1 //Accepted 16888 KB 980 ms 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 using namespace std; 7 const int MAXN = 1005; 8 int n; 9 struct node 10 { 11 double x,y; 12 }p[MAXN*MAXN],e[MAXN]; 13 int num; 14 void pre() 15 { 16 for (int i=0;i<n;i++) 17 { 18 scanf("%lf%lf",&e[i].x,&e[i].y); 19 } 20 for (int i=0;i<n;i++) 21 { 22 for (int j=i+1;j<n;j++) 23 { 24 p[num].x=(e[i].x+e[j].x)/2; 25 p[num++].y=(e[i].y+e[j].y)/2; 26 } 27 } 28 } 29 int cmp(struct node x,struct node y) 30 { 31 if (x.x==y.x) 32 { 33 return x.y<y.y; 34 } 35 else 36 return x.x<y.x; 37 } 38 int slove() 39 { 40 int ans=0; 41 sort(p,p+num,cmp); 42 int temp=1; 43 struct node pp=p[0]; 44 for (int i=1;i<num;i++) 45 { 46 if (p[i].x==pp.x && p[i].y==pp.y) 47 { 48 temp++; 49 } 50 else 51 { 52 ans+=temp*(temp-1)/2; 53 pp.x=p[i].x; 54 pp.y=p[i].y; 55 temp=1; 56 } 57 } 58 return ans; 59 } 60 int main() 61 { 62 int T; 63 scanf("%d",&T); 64 for (int t=1;t<=T;t++) 65 { 66 scanf("%d",&n); 67 num=0; 68 pre(); 69 printf("Case %d: %d\n",t,slove()); 70 } 71 return 0; 72 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。