平面切分- 蓝桥杯第十一届Python组第九题

题目大意

给定多条直线,询问这多条直线将平面分成了几部分?

输入 A 和 B,代表当前直线为y = A * X + B

思路

  1. 我们知道一条直线可以把平面分成两部分,可以理解成这条直线的加入贡献了一个新的部分(可能说的不严谨,指的是答案加1,因为初始状态是一个整的平面)

  2. 若用ci[i]表示第i条加入的直线对答案的贡献

  3. 易知ci[1] = 1

  4. 若当前加入直线与平面内现存直线存在n个不同交点,则ci[i] = 1 + n
  5. 所以最终答案即为ci数组之和

那么ci[i]为什么等于1 + n呢?

简单思考下,第一条加入的直线势必会把平面分成两部分,第二条加入直线如果与第一条平行,那么这条直线只是在分割前面那两部分中的一部分,它不会对另一部分产生影响,如下图所示,用红色矩形表示整平面,则橙色直线不会对紫色区域产生分割。若不平行,那肯定会对紫色区域进行分割。

代码实现

注意要维护新加入直线与先前直线 不同的交点, 用set即可

import sys
n = int(input())
lines = []
for i in range(n):
    a, b = list(map(int, input().split()))
    lines.append((a, b))
lines = list(set(lines))#这里是去掉重复直线
n = len(lines)
def getnode(lines1, lines2):#得到两条直线交点,若平行,返回None
    A1 = lines1[0]
    B1 = lines1[1]
    A2 = lines2[0]
    B2 = lines2[1]
    if A1 - A2 == 0:
        return 
    x = (B2 - B1) / (A1 - A2)
    y = A1 * x + B1
    x = round(x, 10)
    y = round(y, 10)
    return (x, y)
ci = [1] * (n + 1)
node = set()
for i in range(1, n):
    node.clear()
    for j in range(i):
        tmp = getnode(lines[i], lines[j])
        if tmp == None: continue
        node.add(tmp)
    ci[i] += len(node)
        
print(sum(ci[:n]) + 1)        
  • 13
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值