首页 > 代码库 > uva270 - Lining Up(暴力)

uva270 - Lining Up(暴力)

题目:uva270 - Lining Up


解题思路:对于每个点都计算一下,它与其他点的斜率,这样就可以判断与这个点在同一条直线的点。每个点都这样做,维护最大值就可以了。

                 注意斜率不存在的情况。

                 找相同斜率的时候用了multiset。


代码:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <set>
using namespace std;

const int N = 705;
const double esp = 1e-9;

int n;
char str[N];
double ki[N];
int visit[N];

multiset <double> K;

struct NODE {

	double x, y;
}node[N];

double Max (const double a, const double b) { return a > b ? a: b; }
double Fabs (const double a, const double b) { 

	if (a > b)
		return a - b;
	return b - a;
}

int main () {
		
	int t;
	int cnt;
	int count;
	scanf ("%d%*c%*c", &t);
	while (t--) {
		
		n = 0;		
		while (gets(str) != NULL && str[0] != '\0') {
		
			sscanf (str, "%lf%lf", &node[n].x, &node[n].y);
			n++;
		}
		
		cnt = 0;
		for (int i = 0; i < n; i++) {
			K.clear();
			count = 0;
			memset (visit, 0, sizeof (visit));
			for (int j = 0; j < n; j++) {

				if (i == j)
					continue;
				if (Fabs (node[i].x, node[j].x) <= esp) {
					
					count++;
					continue;
				}
				else 
		            ki[j] = (node[i].y - node[j].y) / (node[i].x - node[j].x); 	
				K.insert (ki[j]);
				visit[j] = 1;
           
			}

			for (int j = 0; j < n; j++) {
					
				 if (visit[j]) {

					 cnt = Max (cnt, K.count(ki[j]));
//					 printf ("%d\n", K.count(ki[j]));
				 }
			}
			cnt = Max (cnt, count);
		}
		
		printf ("%d\n", cnt + 1);
		if (t)
		printf ("\n");
			
	}
	return 0;
}