首页 > 试题广场 >

直角三角形的个数

[编程题]直角三角形的个数
  • 热度指数:780 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
二维平面直角坐标系中有N个整型坐标点(x1,y1),(x2,y2),…(xN,yN),任意三个点都可能构成一个三角形,计算这些三角形中直角三角形的个数。

输入描述:
输入有两行:
第一行为N,3≤ N ≤256
第二行为输入N个双字节整型坐标点,共2N个数据,以空格分隔横纵坐标及不同的点,x1 y1 x2 y2 … xn yn… xN yN 


输出描述:
输出直角三角形个数
示例1

输入

20
0 0 0 3 1 2 3 4 5 6 7 8 1 4 2 4 3 5 5 0 5 5 2 0 2 2 3 0 3 3 4 5 6 1 3 7 4 0 5 2

输出

165

备注:
提示:
1、不要重复计算三角形的个数,
2、判断直角三角形用勾股定理
Python3最后一个样例超时,选PyPy3即可
def check(p1, p2, p3):
    vec1 = [p1[0] - p2[0], p1[1] - p2[1]]
    vec2 = [p1[0] - p3[0], p1[1] - p3[1]]
    vec3 = [p2[0] - p3[0], p2[1] - p3[1]]
    return (
        vec1[0] * vec2[0] + vec1[1] * vec2[1] == 0 or
        vec1[0] * vec3[0] + vec1[1] * vec3[1] == 0 or
        vec2[0] * vec3[0] + vec2[1] * vec3[1] == 0
    )

n = int(input())
data = list(map(int, input().split()))

points = [[data[i * 2], data[i * 2 + 1]] for i in range(n)]

ans = 0
for i in range(n):
    for j in range(i + 1, n):
        for k in range(j + 1, n):
            if check(points[i], points[j], points[k]):
                ans += 1
print(ans)




编辑于 2024-08-30 13:53:44 回复(0)