问题描述
给出平面上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)