P9423

· · 题解

这道题思路很简单,暴力枚举所有三角形就可以了,就是时间复杂度有一点高。

但是要注意三点共线的话就不是三角形了。

代码如下:

#include<bits/stdc++.h>
using namespace std;
int x[10050],y[10050];//储存每个点的坐标
double eps=1e-6;
double dis(int a,int b){//计算距离
    return sqrt((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]));
}
bool is(double a,double b,double c){//判断三条边是否可以组成三角形
    if(a+b<=c||b+c<=a||c+a<=b) return 0;
    return 1;
}
int main(){
    int n,ans=0;cin>>n;
    for(int i=1;i<=n;i++) cin>>x[i]>>y[i];
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            for(int k=j+1;k<=n;k++){//枚举所有的点
                double a=dis(i,j),b=dis(j,k),c=dis(k,i);//计算三边
                if(!is(a,b,c)) continue;//判断是否为三角形
                if(abs(a-b)<eps || abs(b-c)<eps || abs(c-a)<eps) ans++;//判断等腰三角形
            }
        }
    }
    cout<<ans;//输出答案
    return 0;
}