解题思路:对于每个点都计算一下,它与其他点的斜率,这样就可以判断与这个点在同一条直线的点。每个点都这样做,维护最大值就可以了。
注意斜率不存在的情况。
找相同斜率的时候用了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;
}