【问题描述】
在平面直角坐标系中,两点可以确定一条直线。如果有多点在一条直线上,
那么这些点中任意两点确定的直线是同一条。
给定平面上 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 ) 之
间的整数的点。请问这些点一共确定了多少条不同的直线。
题解:类似选择排序的两个万能for循环,遍历点集列表的每一个点。求出对应的k和b,然后放入set中去重即可。
Code:
v=[[i,j] for i in range(20) for j in range(21)]
line=set()
for i in range(len(v)-1):
for j in range(i+1,len(v)):
x1,y1=v[i][0],v[i][1]
x2,y2=v[j][0],v[j][1]
if(x1==x2 or y1==y2):
continue
k=(y2 - y1) / (x2 - x1)
b=(x2 * y1 - x1 * y2) / (x2 - x1)
#这个千万不可以写b=y1-k*x1,因为k有可能是小数,要注意精度问题
line.add((k,b))
print(len(line)+20+21)
答案:40257