欢迎光临散文网 会员登陆 & 注册

【蓝桥杯学习记录】直线

2022-04-03 20:42 作者:长舟泛歌  | 我要投稿

一、题目

在平面直角坐标系中,两点可以确定一条直线。

给定平面上 20 × 21 个整点 {(x, y)|0 ≤ x < 20, 0 ≤ y < 21, x ∈ Z, y ∈ Z}即横 坐标是 0 到 19 (包含 0 和 19) 之间的整数、纵坐标是 0 到 20 (包含 0 和 20) 之 间的整数的点。

请问这些点一共确定了多少条不同的直线。

二、解题思路

通过点组合来计算非常复杂,而且对于线重合的情况不好计算,如果用四个点来计算,可以循环(x1,y1),(x2,y2)四个值,但这要四重循环,且验重用斜率比较好计算,所以可以直接用点斜式来计算,通过斜率和截距来验重,点斜式的斜率、截距计算公式如下:

k%3D%5Cfrac%7By2-y1%7D%7Bx2-x1%7D%2Cb%3D%5Cfrac%7B(x2%5Ctimes%20y1)-(x1%5Ctimes%20%20y2)%7D%7Bx2-x1%7D%20%20

于是我们先用一个结构体point来存储下所有的点,再用一个map<<k,b>,flag>,键表示斜率和截距,值表示是否计算过相同的斜率和截距。

这样,通过双重循环来循环结构体,可以达到组合每个点的目的。然后再循环中计算斜率和截距,并检查是否之前计算过。

三、完整代码

四、出现问题

开始结构体中x,y是int类型,ans定义的是double类型,但是结果出来是int类型,出现了问题。

还有就是知道了一个新的知识,就是pair类型,准确来说不是一个类型,而是一个结构体,而且是一个结构体模板,将<>中的两个数据组合成一个数据,所以用的时候需要跟模板一样声明具体是什么类型,然后在传数据的时候因为是结构体,所以可以用{}包起来两个数据。就像上边写的一样。

还有就是C++标准库直到C++11才加入map,所以在编译时编译设置要加入-std=c++11




【蓝桥杯学习记录】直线的评论 (共 条)

分享到微博请遵守国家法律