HOJ 1099 Lining Up
题目大意:给出N个点,求在这N个点中共线的最多点数;
思路:从第一个点开始依次求与其后面所有点的共线的最大点数,最后求所有最大点中的最大点即为所求,主要要考虑到斜率为0和不存在的情况。这种算法的时间复杂度是比较大的,有待改善。。。
Accepted | 1.00 s | 704 K | C++ | 1555 B |
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <math.h>
5
6 int main()
7 {
int n;
9 int input[701][3];
10 double temp[701][2];
11
12 while (scanf("%d", &n)!=EOF && n!=0)
13 {
14 for (int i=1; i<=n; i++)
15 {
16 scanf("%d %d", &input[i][1], &input[i][2]);
17 }
18 for (int i=1; i<=n; i++)
19 {
20 // printf("Point %d:\n", i);
21 for (int j=0; j<=n; j++)
22 {
23 temp[j][0] = 0.0;
24 temp[j][1] = -2.0;
25 }
26
27 for (int j=i+1; j<=n; j++)
28 {
29 double t;
30 if (input[j][1] - input[i][1] == 0)
31 {
32 t = -1;
33 }
34 else
35 {
36 t = fabs((double) (input[j][2] - input[i][2]) /
37 (input[j][1] - input[i][1]));
38 }
39 int k=1;
40 while (temp[k][1] != -2.0)
41 {
42 if (temp[k][1]==t)
43 {
44 temp[k][0] ++;
45 // printf("-----%f----%f---\n", t, temp[k][0]);
46 goto here;
47 }
48 k ++;
49 }
50 here: if (temp[k][1] == -2.0)
51 {
52 temp[k][0] = 1;
53 temp[k][1] = t;
54 // printf("-----%f----%f---\n", t, temp[k][0]);
55 }
56 }
57 int p = 1;
58 int largest = 0;
59 while (temp[p][1] != -2.0)
60 {
61 // printf ("--%-3d %f--\n", temp[p][0], temp[p][1]);
62 if (temp[p][0] > largest)
63 {
64 largest = (int)temp[p][0];
65 }
66 p++;
67 }
68 input[i][0] = largest;
69 }
70 int largest=input[1][0];
71 for (int i=2; i<=n; i++)
72 {
73 if(input[i][0] > largest)
74 {
75 largest = input[i][0];
76 }
77 }
78 printf("%d\n", largest+1);
79 }
80
81 return 0;
82 }
2 #include <stdlib.h>
3 #include <string.h>
4 #include <math.h>
5
6 int main()
7 {
int n;
9 int input[701][3];
10 double temp[701][2];
11
12 while (scanf("%d", &n)!=EOF && n!=0)
13 {
14 for (int i=1; i<=n; i++)
15 {
16 scanf("%d %d", &input[i][1], &input[i][2]);
17 }
18 for (int i=1; i<=n; i++)
19 {
20 // printf("Point %d:\n", i);
21 for (int j=0; j<=n; j++)
22 {
23 temp[j][0] = 0.0;
24 temp[j][1] = -2.0;
25 }
26
27 for (int j=i+1; j<=n; j++)
28 {
29 double t;
30 if (input[j][1] - input[i][1] == 0)
31 {
32 t = -1;
33 }
34 else
35 {
36 t = fabs((double) (input[j][2] - input[i][2]) /
37 (input[j][1] - input[i][1]));
38 }
39 int k=1;
40 while (temp[k][1] != -2.0)
41 {
42 if (temp[k][1]==t)
43 {
44 temp[k][0] ++;
45 // printf("-----%f----%f---\n", t, temp[k][0]);
46 goto here;
47 }
48 k ++;
49 }
50 here: if (temp[k][1] == -2.0)
51 {
52 temp[k][0] = 1;
53 temp[k][1] = t;
54 // printf("-----%f----%f---\n", t, temp[k][0]);
55 }
56 }
57 int p = 1;
58 int largest = 0;
59 while (temp[p][1] != -2.0)
60 {
61 // printf ("--%-3d %f--\n", temp[p][0], temp[p][1]);
62 if (temp[p][0] > largest)
63 {
64 largest = (int)temp[p][0];
65 }
66 p++;
67 }
68 input[i][0] = largest;
69 }
70 int largest=input[1][0];
71 for (int i=2; i<=n; i++)
72 {
73 if(input[i][0] > largest)
74 {
75 largest = input[i][0];
76 }
77 }
78 printf("%d\n", largest+1);
79 }
80
81 return 0;
82 }
PS:比较高效的算法,http://xuun.blog.163.com/blog/static/3322335201022925033949/