【問題描述】
在平面直角坐標系中,兩點可以確定一條直線。如果有多點在一條直線上, 那么這些點中任意兩點確定的直線是同一條。
給定平面上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; }