2021年蓝桥杯C++B组 D题.直线

91 阅读1分钟

4.直线 - 蓝桥云课 (lanqiao.cn)

视频解析:阿里云盘 (aliyundrive.com)

题意解读

这道题问的是两个坐标覆盖的的范围(【0,19】【0,20】)内有多少条直线: image.png

我们知道可以通过斜率k和截距w确定一条直线。我们通过对比两条线的斜率和截距是否相同判断是否为不同的线。注意,当直线为90度的时候斜率不存在,但是因为横坐标是0~19,因此可以确定的是竖着的直线有20条,我们最后答案加上20即可。还有,我们不能够直接判断两条线的截距和斜率是否相同,会有误差,应该通过判断其差值是否大于1e-8来判断。

image.png

code

#include<bits/stdc++.h>
using namespace std;

const int N=200000;  //一共有400个点,400的平方160000,这里开200000够了
int n;


struct Line
{
	double k,b;
	bool operator<(const Line& t)const
	{
		if(k!=t.k)return k<t.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;x2++)
			{
		       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};
				  }
			   }
			}
	   }
	}
	
	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)  //不能直接比较两条线斜率和截距是否相同,会有误差 
        res++;
	}   
	
	cout<<res+20;  //加上那20条垂线 
	return 0;
}

答案:40257