思路:通过确定不同的点之间确定的斜率与截距,将其放入集合中,利用集合的特征(唯一性)对重复的直线进行筛选。我们先将垂直于x轴的直线(斜率不存在的直线)排除在外,再统计其余的直线。
#穷举法
import time
start = time.time()
# 确定点列表。平面上20X21个整点{(x,y)|0≤x<20,0≤y<21,x∈Z,y∈Z}
ptslist = [(x,y) for x in range(20) for y in range(21)]
kdset = set() # 构建一个集合用于存储斜率和截距
# print(type(kdset))
for cor1 in ptslist:
for cor2 in ptslist:
# print(cor1,cor2)
if cor1[0] != cor2[0]: # 将斜率不存在的直线排除在外
k = (cor2[1]-cor1[1])/(cor2[0]-cor1[0]) #计算斜率
d = cor2[1]-k*cor2[0] #计算截距
kdset.add((round(k,10),round(d,10)))#这里有一个小问题,如果我们不将其保留一定的小数位的话,我们所得到的结果与答案不符。
#保留10位小数,越精确重复的概率越小。
print(len(kdset)+20) #加20代表,垂直于x轴的直线,0-19一共20条直线
#结果为:40257
end = time.time()
print(end - start) #0.3580777645111084
关键点:round函数的使用。round(参数,保留的小数位),
print(round(3.5455,2))#2代表保留2位小数位
结果为:3.55