欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于凸多边形对角线交点个数的判断(周总)

程序员文章站 2022-03-15 14:03:13
...

关于凸多边形对角线交点个数的判断(周总)

这是一道洛谷的原创题目,评论区中大部分都是用传统的排列组合方法来进行公式的推导,设有n个顶点,则只需要选出四个顶点,就能有一个交点,所以答案就是C(4,n)

x = int(input())
print ( x * ( x - 1 )// 2 * ( x - 2 ) // 3 * ( x - 3 ) // 4 )

但是,如果没有这个公式,如何写代码呢?

n=int(input())
b=[]
sum=0
for i in range(1,n-1):
    for j in range(i+2,n+1):
        if j-i!=n-1:
            a=[i,j]
            b.append(a)
for o in range(len(b)-1):
    k=b[o]
    for p in range(o+1,len(b)):
        l=b[p]
        if k[0]<l[0]<k[1] and k[1]<l[1]:
            sum+=1
print(sum)

该做法的思路为:

首先,将该凸多边形的顶点依次表上序号,如六边形六个顶点依次为:1,2,3,4,5,6

然后,选出能构成对角线的两个点的组合,构成一个二位列表,经过推断可知,构成对角线的条件为:

1,两个数字的差不能为1,也就是两个点不能相邻。

2,因为1号点与n号点也相邻,但是之间的差值却不是1,所以应该将这种情况排除。

例:六边形经过第一次的筛选可以得到二维列表

[[1, 3], [1, 4], [1, 5], [2, 4], [2, 5], [2, 6], [3, 5], [3, 6], [4, 6]]([1,3]代表点1和点3的连线)

最后一步,我们应该寻找能构成焦点的两条线的关系,经过推导可知:

对于两条对角线[a,b],[c,d]。(a<b,c<d)

如果a<c<b<d或c<a<d<b

即可构成一个交点