第十二届蓝桥杯B组直线题解

试题C:直线本题总分:10分

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

    给定平面上2×3个整点{(x, y)[0 ≤x <2,0≤y <3,x ∈ 'Z,y ∈Z),即横坐标
是0到1(包含0和1)之间的整数、纵坐标是О到2(包含О和2)之间的整数的点。
这些点一共确定了11条不同的直线。

    给定平面上 20×21个整点{(x,y)|0 ≤x <20,0 ≤y < 21,x ∈ 'Z,y ∈ Z),即横
坐标是0到19(包含0和19)之间的整数、
纵坐标是0到20(包含0和20)之间的整数的点。请问这些点一共确定了多少条不同的直线 

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;

const int N  =200000;
int n;

struct Line
{
    double k,b;   //斜率,截距
    bool operator< (const Line& t) const  //直线的排序函数
    
    if(k<t.k) return k<t.k;  //如果k不同的话,斜率在前
    return b< t.b;   //否则截距在前
}l[N];

int main()
{
    for(int x1 = 0; x1<20; x1++)   //枚举所有点对
        for(int y1 = 0; y1<21; y1++)
            for(int x2 = 0; x2<20; x1++)
                for(int y2 = 0; y2<21; y2++)
    
                    if(x1!=x2)
                    {
                        double k = (double)(y2-y1)/(x2-x1);   //求斜率
                        double b = y1-k*x1;    //求截距
                        l[n++] = {k,b}; //存一下k,b
                    }
    sort(l,l+n);  //求不同数有多少个
    int res = 1;
    for(int i = 1;i<n;i++)
        if(fabs(l[i].k - l[i-1].k) > 1e-8 || fabs(l[i].b - l[i-1].b) > 1e-8)
        //当前斜率减去下一个数斜率大于1e-8 或者 当前截距减去上一个数截距大于1e-8
        //说明这两个点不一样

        res++; //不同个数加1

    cout << res+20 <<endl; //加上一条竖线

    return 0;
}

 答案:40257

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值