给出平面上的n个点,现在需要你求出,在这n个点里选3个点能构成一个三角形的方案有几种。
输入描述:
第一行包含一个正整数n,表示平面上有n个点(n <= 100)
第2行到第n + 1行,每行有两个整数,表示这个点的x坐标和y坐标。(所有坐标的绝对值小于等于100,且保证所有坐标不同)
输出描述:
输出一个数,表示能构成三角形的方案数。
输入例子1:
4
0 0
0 1
1 0
1 1
输出例子1:
4
判断 a+b>c 即可,要注意三点在一条直线的情况,同时考虑到如果在枚举的时候进行计算距离 会有很多重复,因此预先把两点距离计算
import math
import sys
def diss(i, j, p):
return math.sqrt((p[i][0]-p[j][0])**2 + (p[i][1]-p[j][1])**2)
def is_same_line(i, j, k, p):
return (((p[j][1]-p[i][1])*(p[j][0]-p[k][0]))==((p[j][0]-p[i][0])*(p[j][1]-p[k][1])))
def main():
n = int(sys.stdin.readline().strip())
points = []
for i in range(n):
points.append(list(map(lambda x: int(x), sys.stdin.readline().strip().split(' '))))
maps = {}
l = len(points)
for i in range(l):
for j in range(i+1, l):
maps[str(i)+str(j)] = diss(i, j, points)
result = 0
for i in range(l):
for j in range(i+1, l):
for k in range(j+1, l):
d1 = maps[str(i)+str(j)]
d2 = maps[str(i)+str(k)]
d3 = maps[str(j)+str(k)]
if d1 + d2 >d3 and not is_same_line(i, j, k, points):
result += 1
print(result)
if __name__ == '__main__':
main()