蓝桥杯第十二届省赛 试题 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值