同一个题目,不一样的形式,见上一篇2002的分析:
#include <iostream>
using namespace std;
struct Node
{
int x,y;
Node * next;
}node[40001];
int n;
int cod[2005][2];
int Find(int x, int y)
{
int key = (x * x + y * y) % 40001;
Node *tmp = &node[key];
while (tmp->next != NULL)
{
tmp = tmp->next;
if (tmp->x == x && tmp->y == y)
{
return 1;
}
}
return 0;
}
int main()
{
while (scanf("%d", &n) != EOF/*&& n*/)
{
memset(node, 0, sizeof(node));
Node * point;
for (int i = 1; i <= n; ++ i)
{
point = new Node;
scanf("%d %d", &cod[i][0], &cod[i][1]);
point->x = cod[i][0];
point->y = cod[i][1];
point->next = NULL;
int key = (cod[i][0] * cod[i][0] + cod[i][1] * cod[i][1]) % 40001;
Node *tmp = &node[key];
while (tmp->next != NULL)
{
tmp = tmp->next;
}
tmp->next = point;
}
int ans = 0;
int x1,y1,x2,y2;
for (int i = 1; i < n; ++ i)
{
for (int j = i + 1; j <= n; ++ j)
{
//two points on one side
x1 = cod[i][0] + (cod[i][1] - cod[j][1]);
y1 = cod[i][1] - (cod[i][0] - cod[j][0]);
x2 = cod[j][0] + (cod[i][1] - cod[j][1]);
y2 = cod[j][1] - (cod[i][0] - cod[j][0]);
if (Find(x1,y1) && Find(x2,y2))
{
ans ++;
}
//
x1 = cod[i][0] - (cod[i][1] - cod[j][1]);
y1 = cod[i][1] + (cod[i][0] - cod[j][0]);
x2 = cod[j][0] - (cod[i][1] - cod[j][1]);
y2 = cod[j][1] + (cod[i][0] - cod[j][0]);
if (Find(x1,y1) && Find(x2,y2))
{
ans ++;
}
}
}
printf("%d\n", ans / 4);
}
return 0;
}