2020年第十一届蓝桥杯python大学组第二场省赛试题I:平面切分的解析与代码

   1.试题分析:
如果新增一条直线:
(1)若该直线与已存在的直线都平行,则增加一个切分平面;
(2)若该直线与已存在的直线产生一个交点,则增加一个切分平面.
那么通过分析与总结我们可以得出这样的公式:
设切分平面数:N(number),直线数:L(lines),有效点数:E(effective),
则N=1+E+L.
其中有效点数的含义是,如果一个交点被k个直线共享,则该交点的有效点数为k-1.
2.代码部分:

    #输入数据
    n=int(input())
    lines=[tuple(map(int,input().split()))for i in range(n)]
    #消除重复的直线
    lines=list(set(lines))
    n=len(lines)
    #编写求直线交点的函数
    def cross(k1,k2,b1,b2):
      x=(b1-b2)/(k2-k1)
      y=(k2*b1-k1*b2)/(k2-k1)
      return (x,y)

    crosses={}
    #求直线交点
    for i in range(n):
      for j in range(i+1,n):
        if lines[i][0]==lines[j][0]:
          continue
        else:
          dot=cross(lines[i][0],lines[j][0],lines[i][1],lines[j][1])
          #储存交点对应的直线
          if dot in crosses.keys():
            crosses[dot].add((lines[i][0],lines[i][1]))
            crosses[dot].add((lines[j][0],lines[j][1]))
          else:
            crosses[dot]=set()
            crosses[dot].add((lines[i][0],lines[i][1]))
            crosses[dot].add((lines[j][0],lines[j][1]))

    crossnum=0
    #计算总的有效点数
    for line in crosses.values():
      crossnum+=len(line)-1
    #切分平面数=1+有效点数+直线数
    print(1+crossnum+n)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kamen Black君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值