【POJ】Parallelogram Counting(HASH,数学之平行四边形)

Posted on 2018-05-02 13:51  som_nico  阅读(233)  评论(0编辑  收藏  举报

Parallelogram Counting

题意:输入t表示有t组数据

   每组数据输入一个数n,表示有n个点

   然后有n行,每行是这个点的(x,y)

   问这些点能组成多少个平行四边形

思路:求中点,中点一样的是一个平行四边形。 

   记录同一个中点的个数sum(初始为1),平行四边形数是(sum-1) * sum / 2;

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
struct zz
{
    double x, y;
};
zz a[1007];
zz b[1007 * 1007];
bool cmp(zz u, zz v)
{
    if(u.x == v.x) return u.y < v.y;
    return u.x < v.x;
}
int main()
{
    /*freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);*/

    int n;
    cin >> n;
    while(n--)
    {
        int i, j, m;
        cin >> m;
        for(i = 0; i < m; i++)
        {
            cin >> a[i].x >> a[i].y;
        }
        int k = 0;
        for(i = 0; i < m - 1; i++)
        {
            for(j = i + 1; j < m; j++)
            {
                if(a[i].x == a[j].x && a[i].y == a[j].y) continue;
                b[k].x = (a[i].x + a[j].x) / 2;
                b[k++].y = (a[i].y + a[j].y) / 2;
            }
        }
        sort(b, b + k, cmp);
        int sum = 0, ans = 1;
        for(i = 0; i < k - 1; i++)
        {
            if(b[i].x == b[i + 1].x && b[i].y == b[i + 1].y)    ans++;
            else
            {
                sum += (ans - 1) * ans / 2;
                ans = 1;
            }
        }
        cout << sum << endl;

    }
    /*fclose(stdin);
    fclose(stdout);*/
    return 0;
}