蓝桥杯 枚举2 27题 直线

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

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

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

给定平面上 20×2120×21 个整点 (x,y)∣0≤x<20,0≤y<21,x∈z,x∈y(x,y)0x<20,0y<21,xZ,yZ,即横 坐标是 0 到 19 (包含 0 和 19) 之间的整数、纵坐标是 0 到 20 (包含 0 和 20​) 之 间的整数的点。

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

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M
  •  1 #include<bits/stdc++.h>
     2 using namespace std;
     3 struct Point{
     4     double x, y;
     5 }p[25*25];//存下每一个点
     6 map<pair<double,double> ,int> line;//pair存斜率k和截距b,表示直线line
     7 int main(){
     8 int cnt = 0;
     9 int col= 20,row=21;
    10     for(int i = 0;i < row;i++){
    11         for(int j = 0;j < col;j++){
    12             p[cnt].x = i;
    13             p[cnt++].y = j;
    14         }
    15     }//21条横线和20条竖线相交的整数交点,一共有cnt个点,也就是row*col个点
    16     int linenum= row+col; //首先有row根横线和col根竖线,下面求斜线
    17     for(int i = 0;i < cnt;i++){
    18         for(int j = 0;j < cnt;j++){
    19             if(p[i].x == p[j].x || p[i].y == p[j].y) continue;
    20       //任意两点的连成的直线与坐标轴平行,或i、j共点,就无需统计,用continue跳过。
    21             //求斜率和截距(k,b)
    22             double k = (p[j].y - p[i].y) / (p[j].x - p[i].x);
    23             double b = (p[j].x * p[i].y - p[j].y * p[i].x) / (p[j].x - p[i].x);
    24             if(line[{k,b}] == 0){//如果此前未出现过此直线line(k,b)
    25                 line[{k,b}] = 1;//那么 记录此时有了此直线
    26                 linenum++; //并且统计直线数量增加1个
    27             }//否则说明此直线之前已经有了,那么就不会再次累加ans。
    28        }
    29     }
    30     cout << linenum<< endl;
    31     return 0;
    32 }

    最后答案  40257

posted @ 2023-01-26 20:45  芜湖大厨师  阅读(60)  评论(0编辑  收藏  举报