寻找散点中在一条直线上点的个数最大值

前日某硕士同学参加 某公司面试,题目是这样:

    如何在一大堆点(坐标x,y已知)中寻找出在一条直线上包含点的个数最大值。编程语言不限。

    同学想过各种办法,有些想法很简单,最容易想到的就是遍历,但是实现非常困难。

    我的思路:(1)两点之间确定一条直线;

              (2)任意一条直线可以用三个参数唯一确定。

    形如:y=ax+b;考虑到特殊情况,垂直x轴,增加一个参数v;

    当v=1时表示直线与x轴垂直,即两点的横坐标相等;否则为0.

这样一来,任意两个点确定的直线可以用三个参数唯一表示,可以用向量(a,b,v)表示。

    如图所示:

                                        

C++代码块:

<span style="font-size:18px;">#include <iostream>

using namespace std;

#include <math.h>

#define Error 1e-5
/************************************
**函数名称:MatrixMax(d,M[])*********
**函数功能:返回向量中的元素最大值***
************************************/
int MatrixMax(int d,int Mtr[])
{
	for (int i=1;i<d;i++)
		if (Mtr[0]<Mtr[i]) Mtr[0]=Mtr[i];
	return Mtr[0];
};
/*************************************
**函数名称:SameRowNum(i,N,Mtr[][3])**
**函数功能:返回矩阵行中与第i行相同数*
*************************************/
int SameColNum(int i,int N,double Mt[][3])
{
	int sum=0;
	for(int j=0;j<N;j++)
	if (Mt[i][0]==Mt[j][0]&&Mt[i][1]==Mt[j][1]&&Mt[i][2]==Mt[j][2])	sum++;
	return sum;
};
int main()
{
	cout << "Please input the number of points:";
	int n;//点的个数
	cin >> n;
	double Point_x[n];//点的横坐标
	double Point_y[n];//点的纵坐标
	cout<<"Please input the coordinates of points"<<endl;
	for (int i=0;i<n;i++)
	{
		cin >> Point_x[i];
		cin >> Point_y[i];
	}
    int N=n*(n-1)/2;//循环次数
    double a[N];//两点确定的直线参数a
    double b[N];//两点确定的直线参数b
    double v[N];//两点确定的直线参数v
    int k=0;
    for (int i=0;i<n-1;i++)
		for (int j=i+1;j<n;j++)
		{
			if (Point_x[j]==Point_x[i])
			{
				a[k]=Point_x[i];
				b[k]=0;
				v[k]=1;
			}
			else
			{
				a[k]=(Point_y[j]-Point_y[i])/(Point_x[j]-Point_x[i]);
				b[k]=(Point_x[j]*Point_y[i]-Point_x[i]*Point_y[j])/(Point_x[j]-Point_x[i]);
				v[k]=0;
			}
			k++;
		};
/*	cout<<"[a;b;v]'="<<endl;
    for (int k=0;k<N;k++)
	{
		cout<<a[k]<<b[k]<<v[k]<<endl;
	};*/
	double M[N][3];
	for (int i=0;i<N;i++)
	{
		M[i][0]=a[i];
		M[i][1]=b[i];
		M[i][2]=v[i];
	};
	int Sum=0;
	int K[N];
	for (int i=0;i<N;i++)
	{
		K[i]=SameColNum(i,N,M);
	};
	Sum=MatrixMax(N,K);
	int Max_Point=(1+sqrt(1+8*Sum))/2;
    cout<<"在一条直线上最多的点的个数为:"<<Max_Point<<endl;
    return 0;
}</span>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用abline函数在散点图中添加一条直线。 代码如下: ```R # 生成散点图 plot(x, y) # 添加直线 abline(h = 9) # h表示水平线,v表示竖直线 ``` 其中,x和y为散点图的数据,h=9表示添加一条y=9的水平直线。 ### 回答2: 在R语言中,我们可以使用函数`abline()`来在散点图中添加一条直线。具体步骤如下所示: 1. 准备散点图数据。可以使用`plot()`函数绘制散点图,例如: ``` x <- c(1, 2, 3, 4, 5) y <- c(6, 8, 10, 12, 14) plot(x, y) ``` 2. 添加y=9的直线。使用`abline()`函数添加直线,其中`h`参数表示所绘制的水平线的y,例如: ``` abline(h = 9) ``` 这行代码将在当前散点图中添加一条y=9的直线。 3. 完整代码如下: ``` x <- c(1, 2, 3, 4, 5) y <- c(6, 8, 10, 12, 14) plot(x, y) abline(h = 9) ``` 以上是使用R语言在散点图中添加一条y=9的线的步骤和代码。 ### 回答3: 在R语言中,我们可以使用函数`abline()`来在散点图中添加一条直线。 首先,我们需要绘制散点图,并将数据点添加到图中。假设数据点保存在一个名为`data`的数据框中,其中包含两个变量`x`和`y`。我们可以使用函数`plot()`来绘制散点图: ```R plot(data$x, data$y) ``` 接下来,我们使用函数`abline()`来添加一条直线。要添加的直线是y=9,我们将设置`a`参数为0,`b`参数为9。代码如下: ```R abline(a = 0, b = 9) ``` 最后,我们可以在散点图中添加一个标题,以及标记x和y轴的标题。例如: ```R title("Scatter plot with y=9 line") xlab("x") ylab("y") ``` 将以上代码组合在一起,完整的R代码如下: ```R # 读取数据 data <- read.csv("data.csv") # 绘制散点图 plot(data$x, data$y) # 添加直线 abline(a = 0, b = 9) # 添加标题和轴标签 title("Scatter plot with y=9 line") xlab("x") ylab("y") ``` 运行以上代码,即可在散点图中添加一条y=9的直线
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值