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)