试题C:直线本题总分:10分
【问题描述】
在平面直角坐标系中,两点可以确定一条直线。如果有多点在一条直线上,
那么这些点中任意两点确定的直线是同一条。
给定平面上2×3个整点{(x, y)[0 ≤x <2,0≤y <3,x ∈ 'Z,y ∈Z),即横坐标
是0到1(包含0和1)之间的整数、纵坐标是О到2(包含О和2)之间的整数的点。
这些点一共确定了11条不同的直线。
给定平面上 20×21个整点{(x,y)|0 ≤x <20,0 ≤y < 21,x ∈ 'Z,y ∈ Z),即横
坐标是0到19(包含0和19)之间的整数、
纵坐标是0到20(包含0和20)之间的整数的点。请问这些点一共确定了多少条不同的直线
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N =200000;
int n;
struct Line
{
double k,b; //斜率,截距
bool operator< (const Line& t) const //直线的排序函数
if(k<t.k) return k<t.k; //如果k不同的话,斜率在前
return b< t.b; //否则截距在前
}l[N];
int main()
{
for(int x1 = 0; x1<20; x1++) //枚举所有点对
for(int y1 = 0; y1<21; y1++)
for(int x2 = 0; x2<20; x1++)
for(int y2 = 0; y2<21; y2++)
if(x1!=x2)
{
double k = (double)(y2-y1)/(x2-x1); //求斜率
double b = y1-k*x1; //求截距
l[n++] = {k,b}; //存一下k,b
}
sort(l,l+n); //求不同数有多少个
int res = 1;
for(int i = 1;i<n;i++)
if(fabs(l[i].k - l[i-1].k) > 1e-8 || fabs(l[i].b - l[i-1].b) > 1e-8)
//当前斜率减去下一个数斜率大于1e-8 或者 当前截距减去上一个数截距大于1e-8
//说明这两个点不一样
res++; //不同个数加1
cout << res+20 <<endl; //加上一条竖线
return 0;
}
答案:40257