资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
平面上有N条直线,其中第 i条直线是 y = Ai*x + Bi。
请计算这些直线将平面分成了几个部分。
输入格式
第一行包含一个整数 N。
以下N行,每行包含两个整数 Ai,Bi。
输出格式
一个整数代表答案。
输入样例
3
1 1
2 2
3 3
输出样例
6
数据范围
对于 50 评测用例, 1 ≤ N ≤ 4,-10 ≤ Ai,Bi ≤ 10。
对于所有评测用例, 1 ≤ N ≤ 1000,-100000≤ Ai,Bi ≤100000。
# 找规律
# 1.没有直线切分的时候只有1个平面
# 2.一条直线将平面切分为2个平面
# 3.加入第二条直线有三种情况:重合、平行、相交
# 重合:没意义,还是两个平面
# 平行:有3个平面
# 相交:有一个交点,分为4个平面
# 4.加入第三条直线,有三种情况:重合、平行、相交
# 重合:与任意一条直线重合都没意义,还是两条直线切分的结果
# 平行:平行的情况是与所有直线平行,再两条直线的基础上+1
# 相交:一个交点切分为5个平面,两个交点切分为6个平面
# ***********
# 以此类推可以发现,每增加一条直线切分平面数就增加n+1(n是交点数)
n = int(input())
arr = set() # 使用set数据类型,可以将重合的线去掉(重合的线没有意义)
# 去掉重合的直线后,平面切分每加一条直线只有两种可能平行和相交,无需再考虑重合
for i in range(n):
arr.add(tuple(map(int,input().split())))
arr = list(arr)
if n == 0: # 没有直线只有一个平面
print(1)
elif n == 1: # 只有一条直线只能切分为两个平面
print(2)
else:
# 第一条直线必然分为两个平面,所以从第二条直线开始逐条增加
num = 2 # 一条直线时有两个平面
for i in range(1, len(arr)):
tmp = set() # 使用set记录交点,交点可能存在重合,因此使用set可以去除重复交点
for j in range(i):
# 题目描述的公式为y = ax + b:a是斜率,只有a不等的时候才有交点
if arr[i][0] != arr[j][0]:
# 计算交点(x, y)
x = (arr[i][1] - arr[j][1])/(arr[j][0] - arr[i][0])
y = arr[i][0] * x - arr[i][1]
tmp.add(tuple([x,y]))
num += len(tmp) + 1
print(num)