蓝桥杯直线(省赛C/C++填空)

Posted 卷王之王1.0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝桥杯直线(省赛C/C++填空)相关的知识,希望对你有一定的参考价值。

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

给定平面上 2 × 3 个整点(x,y)∣0≤x<2,0≤y<3,x∈Z,y∈Z (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(x, y)|0 ≤ x < 20, 0 ≤ y < 21, x ∈ Z, y ∈ Z,即横 坐标是 0到 19 (包含 0 和 19) 之间的整数、纵坐标是 0到 20 (包含 0和 20​) 之 间的整数的点。

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

思路:通过斜率k与b可以确定一条直线,先得k,再通过y=kx+b得到b。map映射模板,让确定的值为1。

#include<bits/stdc++.h>
using namespace std;
struct Point
    double x, y;
p[25*25];//存下每一个点
map<pair<double,double> ,int> mp;//存斜率k和截距b
int main()
    int cnt = 0;
    for(int i = 0;i < 20;i++)
        for(int j = 0;j < 21;j++)
            p[cnt].x = i;
            p[cnt++].y = j;
        
    
    int ans = 20 + 21;
    for(int i = 0;i < cnt;i++)
        for(int j = 0;j < cnt;j++)
            //两点的直线与坐标轴平行或共点
            if(p[i].x == p[j].x || p[i].y == p[j].y) continue;
            //斜率和截距
            double k = (p[j].y - p[i].y) / (p[j].x - p[i].x);
            double b = (p[j].x * p[i].y - p[j].y * p[i].x) / (p[j].x - p[i].x);
            if(mp[k,b] == 0)
                mp[k,b] = 1;
                ans++;
            
        
    
    cout << ans << endl;
    return 0;

以上是关于蓝桥杯直线(省赛C/C++填空)的主要内容,如果未能解决你的问题,请参考以下文章

第十二届蓝桥杯省赛B组 做题记录(python)

2019年第十届蓝桥杯 - 省赛 - C/C++大学B组 - C. 数列求值

2019年第十届蓝桥杯 - 省赛 - C/C++大学B组 - B. 年号字串

蓝桥杯大赛第十届省赛C++B组 填空题题解

第十二届蓝桥杯 ——求余

蓝桥杯省赛C++组别大学B组历年题解