数三角形

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zslngu/article/details/88786786
给出平面上的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()

猜你喜欢

转载自blog.csdn.net/zslngu/article/details/88786786