E - Squares (POJ - 2002)
阿新 • • 發佈:2018-02-15
stream clu ostream clas using 通過 ret for 不同
- 題目大意
有一堆平面散點集,任取四個點,求能組成正方形的不同組合方式有多少。相同的四個點,不同順序構成的正方形視為同一正方形。
- 解題思路
先枚舉兩個相鄰的點,通過數學公式得到另外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; }
E - Squares (POJ - 2002)