关于凸多边形对角线交点个数的判断(周总)
程序员文章站
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
即可构成一个交点
推荐阅读