题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
在平面直角坐标系中,两点可以确定一条直线。如果有多点在一条直线上, 那么这些点中任意两点确定的直线是同一条。
给定平面上 2 × 3 个整点(x,y)∣0≤x<2,0≤y<3,x∈z,y∈z(x,y)∣0≤x<2,0≤y<3,x∈Z,y∈Z,即横坐标 是 00 到 11 (包含 0 和 1) 之间的整数、纵坐标是 0 到 2 (包含 0 和 2) 之间的整数 的点。这些点一共确定了 11 条不同的直线。
给定平面上 20×2120×21 个整点 (x,y)∣0≤x<20,0≤y<21,x∈z,x∈y(x,y)∣0≤x<20,0≤y<21,x∈Z,y∈Z,即横 坐标是 0 到 19 (包含 0 和 19) 之间的整数、纵坐标是 0 到 20 (包含 0 和 20) 之 间的整数的点。
请问这些点一共确定了多少条不同的直线。
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
-
1 #include<bits/stdc++.h> 2 using namespace std; 3 struct Point{ 4 double x, y; 5 }p[25*25];//存下每一个点 6 map<pair<double,double> ,int> line;//pair存斜率k和截距b,表示直线line 7 int main(){ 8 int cnt = 0; 9 int col= 20,row=21; 10 for(int i = 0;i < row;i++){ 11 for(int j = 0;j < col;j++){ 12 p[cnt].x = i; 13 p[cnt++].y = j; 14 } 15 }//21条横线和20条竖线相交的整数交点,一共有cnt个点,也就是row*col个点 16 int linenum= row+col; //首先有row根横线和col根竖线,下面求斜线 17 for(int i = 0;i < cnt;i++){ 18 for(int j = 0;j < cnt;j++){ 19 if(p[i].x == p[j].x || p[i].y == p[j].y) continue; 20 //任意两点的连成的直线与坐标轴平行,或i、j共点,就无需统计,用continue跳过。 21 //求斜率和截距(k,b) 22 double k = (p[j].y - p[i].y) / (p[j].x - p[i].x); 23 double b = (p[j].x * p[i].y - p[j].y * p[i].x) / (p[j].x - p[i].x); 24 if(line[{k,b}] == 0){//如果此前未出现过此直线line(k,b) 25 line[{k,b}] = 1;//那么 记录此时有了此直线 26 linenum++; //并且统计直线数量增加1个 27 }//否则说明此直线之前已经有了,那么就不会再次累加ans。 28 } 29 } 30 cout << linenum<< endl; 31 return 0; 32 }
最后答案 40527