第十二屆藍橋杯省賽試題 C: 直線


【問題描述】

在平面直角坐標系中,兩點可以確定一條直線。如果有多點在一條直線上, 那么這些點中任意兩點確定的直線是同一條。

給定平面上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)之 間的整數的點。請問這些點一共確定了多少條不同的直線。

 

代碼如下:

//直線
//大致思路:依次枚舉各個點,每兩個點生成對應的斜率和截距。最后看有多少個不同的組合,即有多少條不同的直線
//注意事項:類型為double的兩個數值a和b,即使數值相同,對應的double值也有可能不同,故在cpp中比較兩個double值應判斷其abs之差是否在很小的一個范圍之內,例如1e-8
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<math.h>
using namespace std;
const int N=200000;
int n=0;
struct Line
{
    double k;
    double b;
    bool operator < (const Line& t) const
    {
        if(k!=t.k) return k<t.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;x2++)
            {
                for(int y2=0;y2<21;y2++)
                if(x1!=x2)//避免斜率不存在的情況
                {
                    double k=(double)(y2-y1)/(x2-x1);
                    double b=y2-k*x2;
                    // l[n].k=k;
                    // l[n].b=b;
                    // n++;
                    l[n++]={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)
        res++;
        
    }
    cout<<res+20<<endl;
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM