- 题目大意
有一堆平面散点集,任取四个点,求能组成正方形的不同组合方式有多少。相同的四个点,不同顺序构成的正方形视为同一正方形。
- 解题思路
先枚举两个相邻的点,通过数学公式得到另外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; }