题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
在平面直角坐标系中,两点可以确定一条直线。如果有多点在一条直线上, 那么这些点中任意两点确定的直线是同一条。
给定平面上 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) 之 间的整数的点。
请问这些点一共确定了多少条不同的直线。
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
需要用到结构体,map
相关代码
#include<iostream>
#include<map>
using namespace std;
struct Point{
double x,y;
}p[25*25];
map<pair<double,double>,int> line;//存入k,b的值
int main()
{
int cnt=0;
int col=20,row=21;
for(int i=0;i<row;i++)
for(int j=0;j<col;j++){
p[cnt].x=i;
p[cnt++].y=j; //等价于p[cnt].y=j,cnt++;
}
int linenum=row+col;
for(int i=0;i<cnt;i++)
for(int j=0;j<cnt;j++){
if(p[i].x==p[j].x||p[i].y==p[j].y) continue;
double k=(p[j].y-p[i].y)/(p[j].x-p[i].x);
double b=(p[j].x*p[i].y-p[j].y*p[i].x)/(p[j].x-p[i].x);
if(line[{k,b}]==0){
line[{k,b}]=1;
linenum++;
}
}
cout<<linenum<<endl;
return 0;
}