题目描述
平面上有N个坐标各异的点,现在PIPI想知道这N个点当中有多少组非共线的三个点,这三个点的 外心 也在这个N点之中?
PS:三个非共线的点可以确定一个三角形,三角形的外接圆的圆心就是这三个点的外心。
输入
第一行有一个正整数 nn 代表平面上的点数。
接下来有 nn 行,当中的第 ii 行包含两个整数 x,y,代表第 ii 个点的坐标。
-
1≤n≤2000
-
-1e9<=x,y<=1e9
输出
输出一个整数代表答案。
样例输入
5
0 0
-2 0
0 2
-1 1
2 0
样例输出
2
题目思路
思路一:预处理使用map将三个点的外心存起来,遍历坐标找外心个数。能得结果,但会内存超限
思路二:枚举外心
将每个点到其他点的距离存起来,到其他点的距离相等的个数n大于3的时候,就可以记录入结果ans += Cn3。
代码实现
#include <bits/stdc++.h>using namespace std;const int N = 2005;vector<int> d[N]; // 存每个外心到其他点的距离vector<pair<int,int> > ordinate; // 存坐标int main(){ int n; scanf("%d",&n); for(int i = 0;i < n;i++){ int x,y; scanf("%d%d",&x,&y); ordinate.push_back({x,y}); } // 遍历坐标,存距离 for(int i = 0;i < ordinate.size();i++){ for(int j = 0;j < ordinate.size();j++){ pair<int,int> temp1 = ordinate[i],temp2 = ordinate[j]; int dis = (temp1.first - temp2.first) * (temp1.first - temp2.first) + (temp1.second - temp2.second) * (temp1.second - temp2.second); d[i].push_back(dis); } } // 找相同距离 int ans = 0; for(int i = 0;i < n;i++){ vector<int> temVec = d[i]; sort(temVec.begin(),temVec.end()); int x = temVec[0]; int cnt = 1; // 记录相等个数 for(int i = 1;i < temVec.size();i++){ if(temVec[i] != x) { if(cnt >= 3) ans += cnt*(cnt-1)*(cnt-2) / 6; x = temVec[i]; cnt = 1; }else{ cnt++; } } if(cnt >= 3) ans += cnt*(cnt-1)*(cnt-2) / 6; } printf("%d\n",ans); return 0;}