【问题描述】
在平面直角坐标系中,两点可以确定一条直线。如果有多点在一条直线上, 那么这些点中任意两点确定的直线是同一条。
给定平面上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; }