题目的意思就是给出n个点的坐标,选出最多的点,在一条直线上。
就是连接任意两点得到一条线,然后遍历每个点,算出在这条线上点的数量,三层。。有点暴力。。
AC代码:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include<iostream>
using namespace std;
const int N = 710;
int n;
struct point{
int x,y;
}p[N];
int line(int i ,int j ,int k) {
return (p[j].y-p[i].y)*(p[k].x-p[i].x) - (p[j].x-p[i].x)*(p[k].y-p[i].y);
}
void solve() {
int m = 2;
for(int i = 0; i < n; i++)
for(int j = i + 1 ; j < n ; j++) {
int res = 2;
for(int k = j + 1; k < n; k++)
if(k != i && k != j) {
if(!line(i,j,k))
res++;
}
if(res > m)
m = res;
}
printf("%d\n",m);
}
int main() {
int T;
scanf("%d",&T);
getchar();
getchar();
while(T--) {
char str[100 + 10];
n = 0;
while(1) {
if (!gets(str))
break;
if(strcmp(str,"") == 0)
break;
sscanf(str,"%d%d",&p[n].x , &p[n].y);
n++;
}
solve();
if(T) printf("\n");
}
return 0;
}