蓝桥杯-平面切分

问题描述

  给出平面上n条不同的直线,其中,第i条直线经过(ai,bi), (ci,di)两个点。问这些直线把平面分成了几个区域。

输入格式

  第一行包含一个整数n。

  第二行包含n个整数a1,a2,...,an;

  第三行包含n个整数b1,b2,...,bn;

  第四行包含n个整数c1,c2,...,cn;

  第五行包含n个整数d1,d2,...,dn;

输出格式

  输出一个整数表示平面上区域的个数。

样例输入

4

0 0 1 0

0 0 0 1

1 0 1 1

0 1 1 1

样例输出

9

思路:

问题: n条直线可以将一个平面划分成多少个部分平面?注意:这些直线有可能平行,也可能几条直线相较于一个交点!

解决步骤

  • 不要想着一次性就将所有直线放到这些平面上,应该一条一条的把直线放到平面上。

  • 每次放入一条直线,看看这条直线会与平面上已有的直线产生多少个不同的交点。假如会产生a个交点,那么可以知道,放入了这条直线后,部分平面的个数会增加a+1

  • 从第1条直线开始放置到平面上,直至放置第n条结束。将每次放入一条直线后部分平面个数增加的个数累加起来就是最终的答案。

所以:

n=int(input())
a=list(map(int,input().split()))
b=list(map(int,input().split()))
c=list(map(int,input().split()))
d=list(map(int,input().split()))
result=2
for i in range(1,n):
    used=set()
    for j in range(i):
        if c[i]==a[i] and c[j]==a[j]:
            continue
        elif c[i]==a[i] and c[j]!=a[j]:
            k2=(d[j]-b[j])/(c[j]-a[j])
            b2=b[j]-k2*a[j]
            px=a[i]
            py=k2*px+b2
            used.add((px,py))
        elif c[i]!=a[i] and c[j]==a[j]:
            k1=(d[i]-b[i])/(c[i]-a[i])
            b1=b[i]-k1*a[i]
            px=a[j]
            py=k1*px+b1
            used.add((px,py))
        else:
            k1=(d[i]-b[i])/(c[i]-a[i])
            b1=b[i]-k1*a[i]
            k2=(d[j]-b[j])/(c[j]-a[j])
            b2=b[j]-k2*a[j]
            if k1==k2:
                continue
            px=(b2-b1)/(k1-k2)
            py=k1*px+b1
            used.add((px,py))
    print(used)
    result+=len(used)+1
print(result)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值