直线 题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 在平面直角坐标系中,两点可以确定一条直线。如果有多点在一条直线上, 那 么这些点中任意两点确定的直线是同一条。 给定平面上 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 最大运行内存: 128
代码如下 利用map映射可以解决
#include<bits/stdc++.h>
using namespace std;
struct A {
double x,y;
} p[625];
map<pair<double,double>,int> mp;
int main() {
int sum=41;
double k,b;
int cnt;
for(int i=0; i<20; i++)
for(int j=0; j<21; j++) {
p[cnt].x=i;
p[cnt++].y=j;
}
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;//每个结构体元素里面还有存放的坐标点 两个for循环并不是代表坐标
//而是第i个结构体和第j个结构体组成的直线是否是不同的直线 枚举
double k=(p[i].y-p[j].y)/(p[i].x-p[j].x);
double b=(p[i].x*p[j].y-p[j].x*p[i].y)/(p[i].x-p[j].x);
if(mp[pair<double,double>(k,b)]==0) {
sum++;
mp[pair<double,double>(k,b)]=1;
}
}
}
cout<<sum;
}
思路是借鉴的某位大佬的,记录一下日后回看