poj2780Linearity(多点共线)

链接

判断最多多少点在一条直线上,

可以枚举每一个点为坐标系的原点,其它点变成相应的位置,然后求得过原点及其点的斜率,排序找一下最多相同的。

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 #include<vector>
 7 #include<cmath>
 8 #include<queue>
 9 #include<set>
10 #include<map>
11 using namespace std;
12 #define N 1010
13 #define LL long long
14 #define INF 0xfffffff
15 const double eps = 1e-8;
16 const double pi = acos(-1.0);
17 const double inf = ~0u>>2;
18 
19 struct point
20 {
21     int x,y;
22     point(int x=0,int y=0):x(x),y(y){}
23 }p[N];
24 double o[N];
25 
26 typedef point pointt;
27 pointt operator -(point a,point b)
28 {
29     return point(a.x-b.x,a.y-b.y);
30 }
31 int dcmp(double x)
32 {
33     if(fabs(x)<eps) return x;
34     return x<0?-1:1;
35 }
36 
37 int main()
38 {
39     int n,i,j;
40     while(scanf("%d",&n)!=EOF)
41     {
42         for(i = 1; i <= n; i++)
43         {
44             scanf("%d%d",&p[i].x,&p[i].y);
45         }
46         int maxz=0;
47         for(i = 1; i <= n; i++)
48         {
49             int ans = 0 ,g=0;
50             for(j = 1; j <= n ;j++)
51             {
52                 int x = p[j].x-p[i].x;
53                 int y = p[j].y-p[i].y;
54                 if(x==0)
55                 ans++;
56                 else o[g++] = y*1.0/x;
57             }
58             sort(o,o+g);
59             int num = 2;
60             for(j = 1; j < g; j++)
61             if(dcmp(o[j]-o[j-1])==0)
62             num++;
63             else
64             {ans = max(ans,num);
65                 num = 2;
66 
67             }
68             ans = max(ans,num);
69             maxz = max(maxz,ans);
70         }
71         printf("%d
",maxz);
72     }
73     return 0;
74 }
View Code
原文地址:https://www.cnblogs.com/shangyu/p/3875005.html