P9423 [蓝桥杯 2023 国 B] 数三角 题解

· · 题解

思路

使用三重循环枚举每个坐标,使用勾股定理求每两点之间的距离。最后判断这 3 个点是否能成为等腰三角形,再使用累加器计数,最后输出结果即可。

代码

Python:

import math #注意一定要导入math库
n = int(input())
ans = 0
a = [None] + [list(map(int, input().split())) for _ in range(n)]
def len(xx, yy):
    return math.sqrt((a[xx][0]-a[yy][0])**2 + (a[xx][1]-a[yy][1])**2) #勾股定理
for i in range(1, n+1):
    for j in range(1, i):
        for k in range(1, j):
            len1 = len(i, j)
            len2 = len(j, k)
            len3 = len(i, k)
            if len1+len2>len3 and len2+len3>len1 and len1+len3>len2:
                if len1==len2 or len2==len3 or len1==len3:
                    ans += 1

print(ans)

C++:

#include<bits/stdc++.h>
using namespace std;
int n,ans=0;
struct node{
    int x,y;
}a[10005];
double len(int xx,int yy){
    return sqrt((a[xx].x-a[yy].x)*(a[xx].x-a[yy].x)+(a[xx].y-a[yy].y)*(a[xx].y-a[yy].y))*1.00;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i].x>>a[i].y;
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<i;j++){
            for(int k=1;k<j;k++){
                double len1=len(i,j);
                double len2=len(j,k);
                double len3=len(i,k);
                //cout<<len1<<" "<<len2<<" "<<len3<<endl;
                if(len1+len2>len3&&len2+len3>len1&&len1+len3>len2){
                    //cout<<1<<endl;
                    if(len1==len2||len2==len3||len1==len3) ans++;
                }
            }
        }
    }
    cout<<ans;
    return 0;
}