继续复习
暴力
给出n个点的坐标,选出最多的点,在一条直线上
直接暴力,不过时间比较糟糕。一个二重循环,枚举i,j两个点,这两点确定一条直线,然后枚举剩下的点看是否在这条直线上,所以一个三重循环,时间复杂度O(n^3)
注意枚举不要做重复的工作,否则会超时
另外这题是有O(n^2logn)的算法的
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define N 710 #define LEN 110 int n; struct point { int x,y; }p[N]; typedef struct point point; 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 max = 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 > max) max = res; } printf("%d\n",max); } int main() { int T; scanf("%d",&T); getchar(); getchar(); while(T--) { char str[LEN]; n = 0; while(1) { if(!gets(str)) break; if(!strcmp(str,"")) break; sscanf(str,"%d%d",&p[n].x , &p[n].y); n++; } solve(); if(T) printf("\n"); } return 0; }