蓝桥杯第十二届省赛 试题 C: 直线(Python最简写法12行)

【问题描述】
在平面直角坐标系中,两点可以确定一条直线。如果有多点在一条直线上,
那么这些点中任意两点确定的直线是同一条。
给定平面上 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

猜你喜欢

转载自blog.csdn.net/Dai_sir_man/article/details/123281584