2021届蓝桥杯:直线问题

问题描述
  在平面直角坐标系中,两点可以确定一条直线。如果有多点在一条直线上,那么这些点中任意两点确定的直线是同一条。
  给定平面上 2 × 3 2 × 32×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}{(x,y)∣0≤x<2,0≤y<3,x∈Z,y∈Z},即横坐标是 0 00 到 1 11 (包含 0 00 和 1 11) 之间的整数、纵坐标是 0 00 到 2 22 (包含 0 00 和 2 22) 之间的整数的点。这些点一共确定了 11 1111 条不同的直线。
  给定平面上 20 × 21 20 × 2120×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}{(x,y)∣0≤x<20,0≤y<21,x∈Z,y∈Z},即横坐标是 0 00 到 19 1919 (包含 0 00 和 19 1919) 之间的整数、纵坐标是 0 00 到 20 2020 (包含 0 00 和 20 2020) 之间的整数的点。请问这些点一共确定了多少条不同的直线。
答案提交
  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

#include<bits/stdc++.h>
using namespace std;
/*使用y=kx+b来表示直线*/
struct Line
{
	double k, b;
}L[1000000];
int n;
/*排序函数,斜率从小到大排序,斜率相同时按截距从小到大排序*/
bool cmp(Line a, Line b)
{
	if (a.k != b.k)
	{
		return a.k < b.k;
	}
	else
		return a.b < b.b;
}
int main()
{
	/*枚举所有可能的情况,注意当横坐标相等时斜率不存在*/
   for(int x1=0;x1<=19;x1++)
	   for(int y1=0;y1<=20;y1++)
		   for(int x2=0;x2<=19;x2++)
			   for (int y2 = 0; y2 <= 20; y2++)
			   {
				   if (x1 != x2)
				   {
					   double k = double(y2 - y1) / (x2 - x1);
					   double b = y1-k*x1;
					   L[n++] = { k,b };
				   }
			   }
   sort(L, L + n,cmp);  
   int res = 1;//答案初始化为1,因为第一条直线肯定被计算
   //从第二条直线开始,判断与前一条的直线的斜率,截距是否相等
   for (int i=1;i<n;i++)
   {
	   /*最重要的部分,注意double类型的精度问题,这里认为当2条直线的斜率或截距之差大于1e-8才是2条不同的直线*/
	   if (L[i].k - L[i - 1].k > 1e-8 || L[i].b - L[i - 1].b > 1e-8)
		   res++;
   }
   cout << res + 20;//加上20条竖线,因为在之前的计算中它们的斜率不存在
   return 0;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值