采用组合的思路,让每个点都成为等腰三角形的顶点
对于每一个点生成一张map图,表中记录了其他点到这个点的距离,同时把距离相同的多个点存进一个数组当中
然后遍历map图,在同一个数组中选出两个点,然后检查一下是否三点共线,不共线就可以组成一个三角型
pow函数可以用于多次方求值,pow(数字,几次方);
#include<iostream>
#include<vector>
#include<map>
#include<cmath>
using namespace std;
typedef long long int LL;
typedef pair<int,int> PII;
double dis(LL x1,LL y1,LL x2,LL y2)
{
//pow函数前面是数,后面是几次方
return pow((x1-x2),2)+pow((y1-y2),2);
}
bool check(PII p1,PII p2,PII p3)
{
if(p1.second==p2.second&&p1.second==p3.second) return true;//分母为0的情况
double a=(p1.first-p2.first)*1.0/(p1.second-p2.second);
double b=(p1.first-p3.first)*1.0/(p1.second-p3.second);
return abs(a-b)<1e-6;//可能会存在一定的误差,只要差值很小我们就认为共线
}
int main()
{
int n;
cin>>n;
vector<PII> arr;
for(int i=0;i<n;i++)
{
LL x,y;
cin>>x>>y;
arr.emplace_back(x,y);
}
LL ans=0;
vector<map<double,vector<int>>> equ(n);
for(int i=0;i<n;i++)
{
auto m=equ[i];
//equ[i]存储的这是哪个点对应的map图
//map表的含义是存储有哪些点到这个点的距离为key,保存在一个数组当中
for(int j=0;j<n;j++)
if(j!=i)
{
PII p1=arr[i],p2=arr[j];
double d=dis(p1.first,p1.second,p2.first,p2.second);
m[d].push_back(j);
}
for(const auto&[k,v] : m)//遍历map图
{
for(int a=0;a<v.size();a++)
for(int b=a+1;b<v.size();b++)
if(!check(arr[i],arr[v[a]],arr[v[b]]))//判断三点是否共线
ans++;
}
}
cout<<ans<<endl;
return 0;
}