- 题目大意
有一堆平面散点集,任取四个点,求能组成正方形的不同组合方式有多少。相同的四个点,不同顺序构成的正方形视为同一正方形。
- 解题思路
先枚举两个相邻的点,通过数学公式得到另外2个点,使得这四个点能够成正方形。然后检查散点集中是否存在计算出来的那两个点,若存在,说明有一个正方形。但由于在计算过程中,点枚举了两次,因此最终结果需要除以2。
- 代码
#include<iostream>
#include<algorithm>
using namespace std;
struct point
{
int x, y;
}p[1001];
int n;
bool f(point a, point b)
{
if (a.x == b.x)
return a.y < b.y;
return a.x < b.x;
}
bool find(int x, int y)
{
int l = 0, r = n-1;
while (r >= l)
{
int m = (l + r)/2;
if (p[m].x == x && p[m].y == y)
return 1;
if (p[m].x > x || (p[m].x == x && p[m].y > y))
r = m - 1;
else
l = m + 1;
}
return 0;
}
int main()
{
int x, y, sum;
while (cin >> n)
{
if(n==0)
break;
sum = 0;
for (int i = 0; i < n; i++)
cin >> p[i].x >> p[i].y;
sort(p, p + n, f);
for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{
x = p[i].y - p[j].y + p[i].x;
y = p[j].x - p[i].x + p[i].y;
if (find(x, y) == 0)
continue;
x = p[i].y - p[j].y + p[j].x;
y = p[j].x - p[i].x + p[j].y;
if (find(x, y))
sum++;
}
}
cout << sum / 2 << endl;
}
return 0;
}