平行四边形数

来源:互联网 发布:js模拟按键 编辑:程序博客网 时间:2024/05/01 06:13

在一个平面内给定n个点,任意三个点不在同一条直线上,用这些点可以构成多少个平行四边形?一个点可以同时属于多个平行四边形。

Input
多组数据(<=10),处理到EOF。

每组数据第一行一个整数n(4<=n<=500)。接下来n行每行两个整数xi,yi(0<=xi,yi<=1e9),表示每个点的坐标。

Output
每组数据输出一个整数,表示用这些点能构成多少个平行四边形。

Sample Input
4
0 1
1 0
1 1
2 0
Sample Output
1

[分析]
大家可能一开始的思路是算斜率,但是应该算中点。
两个点构成一条线,两个线能确定一个中点。
如果两条线的中点是重合的,那么久能构成一个平行四边形!!!

这里分享一个究极大佬的代码。

代码风格十分飘逸简短。我看了好久才看懂
大意:输入一个点,对其之前输入的点凑对,构成一个中点(虽然他没除二,但中点*2也是唯一的,所以不影响),查询这个中点map的值然后将值加入ans,然后map值自加。
[代码]

#include<cstdio>#include<map>#include<cstring>using namespace std;int x[505], y[505];int main(){    int n;    while(scanf("%d", &n)!=EOF)    {        int i, j, ans = 0;        memset(x, 0, sizeof(x));        memset(y, 0, sizeof(y));        map<pair<int, int>, int>a;        a.clear();        for (i = 0; i < n; i++)        {            scanf("%d%d", &x[i], &y[i]);            for (j = 0; j < i; j++)            {                ans += a[make_pair(x[i] + x[j], y[i] + y[j])]++;            }        }        printf("%d\n", ans);    }}
原创粉丝点击