在平面直角坐标系中,两点可以确定一条直线。如果有多点在一条直线上, 那么这些点中任意两点确定的直线是同一条。
给定平面上 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},即横坐标 是 0到 1 (包含 0 和 1) 之间的整数、纵坐标是 0 到 2 (包含 0 和 2) 之间的整数 的点。这些点一共确定了 11
条不同的直线。
给定平面上 20×21 个整点 (x,y)∣0≤x<20,0≤y<21,x∈Z,y∈Z{(x, y)|0 ≤ x < 20, 0 ≤ y < 21, x ∈
Z, y ∈ Z},即横 坐标是 0到 19 (包含 0 和 19) 之间的整数、纵坐标是 0到 20 (包含 0和 20) 之 间的整数的点。
请问这些点一共确定了多少条不同的直线。
思路:通过斜率k与b可以确定一条直线,先得k,再通过y=kx+b得到b。map映射模板,让确定的值为1。
#include<bits/stdc++.h> using namespace std; struct Point{ double x, y;
}p[25*25];//存下每一个点 map<pair<double,double> ,int> mp;//存斜率k和截距b int main(){ int
cnt = 0; for(int i = 0;i < 20;i++){ for(int j = 0;j < 21;j++){ p[cnt].x = i;
p[cnt++].y = j; } } int ans = 20 + 21; 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(mp[{k,b}] == 0){
mp[{k,b}] = 1; ans++; } } } cout << ans << endl; return 0; }