UVa270

给你N个点(N<700)

求最多在一条直线上的点。

枚举以每一个点为原点,求它与其他点的斜率,斜率相同则说明在同一条直线上。

只要枚举然后排序,最后求连续最长斜率相同的点就可以了。

AC代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int Arsize=701;
struct Node{
	float x,y;
};
Node coordinate[Arsize];
int max_node;
double k_gradient[Arsize];
int main()
{
	int case_num,i,num_coordinate,j,k,num,m,l;
	char str[100];
	cin >> case_num;
	cin.get();
	cin.get();
	while(case_num--){
		i=0;
		max_node=0;
		while(gets(str)){
			if(!str[0])
				break;
			sscanf(str,"%f%f",&coordinate[i].x,&coordinate[i].y);
			i++;
		}
		num_coordinate=i;
		for(i=0;i<num_coordinate;i++){
			for(j=0,k=0;j<num_coordinate;j++){
				if(i!=j){
					k_gradient[k++]=(coordinate[i].y-coordinate[j].y)/(coordinate[i].x-coordinate[j].x);
				}
			}
			sort(k_gradient,k_gradient+k);
			for(k=0;k<num_coordinate-1;k++){
				for(m=k,l=k+1,num=2;k_gradient[m]==k_gradient[l];m++,l++,num++)
					;
				if(num>max_node)
					max_node=num;
			}
		}
		cout << max_node;
		cout << endl;
		if(case_num)
			cout << endl;
	}
	return 0;
}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值