#include<iostream>
using namespace std;
#include<algorithm>
#include<cmath>
//本题思路:判断点是否落在同一条直线上,也即判断点是否都满足同一条直线方程: y=kx+b
//先将所有直线的k,b求出存放到结构体Line中,然后对直线按照k,b由小到大排序,之后前后进行两两比较,找出k或b不同的直线,然后+1,最后还要加上20条斜率不存在的直线,也即垂直于x轴的直线
//注意浮点数相等的条件是 fabs(a-b)<1e-8 因为两个数除后,因为精度问题存在略微的偏差,只要是在此范围的,都认为相等
#define N 600000 //一共有20*20=400个点,最多有[400*(400-1)]/2 条直线 ,这里就直接写 200*400
struct Line
{
double k, b;
//因为是结构体,需要重载 '<' 运算符,方便后面将直线按斜率从小到大排序
bool operator <(const Line& t) const
{
if (k != t.k)
return k < t.k;
return b < t.b;
}
};
int main()
{
int x1, y1, x2, y2;
double k, b; //斜率和截距
Line L[N]; //存放直线k,b的结构体
int i = 0;
//思路其实还是暴力算法
for (x1 = 0; x1 < 20; x1++)
{
for (y1 = 0; y1 < 21; y1++)
{
for (x2 = 0; x2 < 20; x2++)
{
for (y2 = 0; y2 < 21; y2++)
{
if (x1 != x2) //若斜率不为0
{
k = double(y2 - y1) / (x2 - x1);
b = double(y1 - k * x1);
L[i++] = { k,b };
}
}
}
}
}
sort(L, L + i);
int count = 1; //因为后面j是从第二条直线开始判断的,第一条直线不用比较,所以count应该是1而不是0
//int count=0; error
for (int j = 1; j < i; j++)
{
if (fabs(L[j].k - L[j - 1].k) > 1e-8 || fabs(L[j].b - L[j - 1].b) > 1e-8)
count++;
}
cout << count + 20 << endl;
return 0;
}
第12届 蓝桥杯填空题 直线(刷题记录)
最新推荐文章于 2023-03-18 16:42:53 发布