题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
在平面直角坐标系中,两点可以确定一条直线。如果有多点在一条直线上, 那么这些点中任意两点确定的直线是同一条。
给定平面上 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) 之 间的整数的点。
请问这些点一共确定了多少条不同的直线。
解析
此题通过两点坐标求得直线。那么首先我们利用斜截式(y=ax+b)把斜率a和截距b求出来,其a和b就能确定一条直线,可以用pair合成为1个元素,然后我们利用set去重的特性,就可以得到符合条件的直线。
#include<bits/stdc++.h>
using namespace std;
double k;
double b;
//typedef pair<double,double> v;
//set<v> zll;
set<pair<double,double> >zll;
int main(){
//40257
int num=0;
long long int sum=0;
for(int i=0;i<20;i++){//行 x1
for(int j=0;j<21;j++){//列 y1
for(int w=0;w<20;w++){//行 x2
for(int l=0;l<21;l++){//列 y2
if(i==w||j==l){//不同行或不同列
continue;
}
k=(l-j)*1.0/(w-i);
b=(j*w-i*l)*1.0/(w-i);
//k=(l-j)*1.0/(w-i);
//b=(j*1.0)-((l-j)*1.0/(w-i))*i;
zll.insert({k,b});
}
}
}
}
cout<<zll.size()+21+20<<endl;
return 0;
}