?
只要两条直线的k,b相同那么就可以判断是同一条直线。所以我们使用set集合,根据kb去重。
直线公式:y=kx+b
k=(y2-y1)/(x2-x1)
将(x1,y1)、(x2,y2)代入方程,得 b =?(y1*x2-y2*x1)/(x2-x1)
因为这里的x1y1,x2,y2都是int类型,所以需要通过*1.0转换成浮点类型,否则会失去精度造成误差。
两种特殊情况
1.当直线与X轴平行时 y1=y2, b=0
2.当直线与y轴平行时 x1=x2,0不能当做分母
所以以上两种情况需要单拎出来。
最后输出的时候,加上m行n列,即可确定总线数。
#include<bits/stdc++.h>
using namespace std;
typedef pair<double,double> P;
int n =20,m = 21;
set<P> s1;
void check(int x1,int y1,int x2,int y2){
if(x1==x2||y1==y2)
return;
double k,b;
k=(y2-y1)*1.0/(x2-x1);
b = (y1*x2-y2*x1)*1.0/(x2-x1);
s1.insert({k,b});
}
int main(){
for(int x1=0;x1<n;x1++)
for(int y1=0;y1<m;y1++)
for(int x2=0;x2<n;x2++ )
for(int y2=0;y2<m;y2++)
check(x1,y1,x2,y2);
cout<<s1.size()+n+m;
}
|