在平面直角坐标系中,两点可以确定一条直线。如果有多点在一条直线上, 那么这些点中任意两点确定的直线是同一条。
给定平面上 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) 之间的整数 的点。这些点一共确定了 1 条不同的直线。
给定平面上 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) 之 间的整数的点。
请问这些点一共确定了多少条不同的直线。
分析:首先要知道直线怎么确定,平面直线的一般式为y = kx + b,其中k称为直线斜率,b称为截距,所以直线由k和b确定,即一对kb确定一条直线。因此可以利用c++语言中的map来匹配这一对值并赋予标志值,最后统计map对象的个数即可。
核心代码:
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 pri = 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[i].y*p[j].x-p[i].x*p[j].y)/(p[j].x - p[i].x);
if(mp[{k, b}] == 0)
{
mp[{k, b}] = 1;
pri++;
}
}
}
cout << pri << endl;
答案:40257