2021蓝桥杯省赛:直线(Java B组)

题目描述:

在平面直角坐标系中,两点可以确定一条直线。如果有多点在一条直线上, 那么这些点中任意两点确定的直线是同一条。

给定平面上 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值