题目描述:
在平面直角坐标系中,两点可以确定一条直线。如果有多点在一条直线上, 那么这些点中任意两点确定的直线是同一条。
给定平面上 2 × 3 个整点,(x,y)∣0≤x<2,0≤y<3,x∈Z,y∈Z,即横坐标 是 0到1 (包含 0 和 1) 之间的整数、纵坐标是 0 到 2 (包含 0 和 2) 之间的整数 的点。这些点一共确定了 11 条不同的直线。
给定平面上20×21 个整点, (x,y)∣0≤x<20,0≤y<21,x∈Z,y∈Z,即横 坐标是 0到19 (包含0和19)之间的整数、纵坐标是 0到20(包含0和20)之间的整数的点。
请问这些点一共确定了多少条不同的直线。
题目类型:
填空题
运行限制:
最大运行时间:1s
最大运行内存:128MB
问题分析:
该题起初我想直接一条一条直线去找,发现挺困难的,又试着找规律,也挺困难,然后开始看题解,恍然大悟。有个巧妙的方法,因为这是填空题,我们可以用python来解决,速度快一些。
正文如下:
要解决该问题,有两个要点,一是斜率,二是截距,这两个要素确定了,直线也就确定了,所以我们可以遍历,去找任意两个点确定的直线,用set集合存储k和b的值,如果该元素不存在于集合中,就存进去,用set集合可以去除重复的元素。
利用数学知识可以求出公式:
k*x1+b=y1
k*x2+b=y2
k=(y2-y1)/(x2-x1)
b=(x2*y1-x1*y2)/(x2-x1)
需要注意的是,这个公式中不能求出x1==x2或者y1==y2的直线,所以遍历计算时我们需要加以限制。平行于x轴和平行于y轴的直线一共有41条,所以line的初始值为41,然后去遍历。
代码如下:
line = 41
s = set()
for x1 in range(0,20):
for y1 in range(0,21):
for x2 in range(0,20):
for y2 in range(0,21):
if x1!=x2 and y1!=y2:
k = (y2 - y1) / (x2 - x1)
b = (x2 * y1 - x1 * y2) / (x2 - x1)
if (k, b) not in s:
s.add((k, b))
line+=1
else:
continue
print(line)
由此可求出结果为40257