Lining Up
''How am I ever going to solve this problem? "Said the pilot.
Indeed, the pilot was not facing an easy task. she had to drop packages at specific points scattered in a dangerous area. furthermore, the pilot cocould only fly over the area once in a straight line, and she had to fly over as your points as possible. all points were given by means of integer coordinates in a two-dimen1_space. the pilot wanted to know the largest number of points from the given Set that all lie on one line. Can you write a program that calculates this number?
Your program has to be efficient!
Input
The input begins with a single positive integer on a line by itself indicating the number of the cases following, each of them as described below. this line is followed by a blank line, and there is also a blank line between two consecutive inputs.
The input consists of N pairs of integers, where 1 <N <700. each pair of integers is separated by one blank and ended by a new-line character. the list of pairs is ended with an end-of-file character. no pair will occur twice.
Output
For each test case, the output must follow the description below. The outputs of two consecutive cases will be separated by a blank line.
The output consists of one integer representing the largest number of points that all lie on one line.
Sample Input
1
1 1
2 2
3 3
9 10
10 11
Sample Output
3
Point Coordinates. Calculates the maximum number of common points ..
Idea: I am using brute force enumeration. Give two points each time. As a straight line. The third point of enumeration is not in a straight line. A formula can be introduced.
Y (x1-x2) = (y1-y2) * x + y2 * x1-y1 * x2. (X, y) is in a straight line composed of (x1, y1) and (x2, y2 .. However, in this case, the time complexity is O (n ^ 3)... there is an optimization in the middle. If the connection has been established before the two points. You can skip this step .. But it still runs for 2 seconds. --
When you look at other people's practices on the Internet, there is a time complexity of O (n ^ 2 logn .. Is to enumerate a vertex each time as the origin. Then calculate the other points and their slope. Then, find out the maximum number of occurrences of the same slope among these slopes. It feels good.
My code:
#include <stdio.h>#include <string.h>int t;int n, i, j, k, l;int max, ans;int vis[705][705];int mark[705];char sb[30];struct Point {int x, y;} p[705];int main() {scanf("%d%*c%*c", &t);while (t --) {n = 0; max = 0;memset(vis, 0, sizeof(vis));while (gets(sb) && sb[0] != '\0') {sscanf(sb, "%d%d", &p[n].x, &p[n].y);n ++;}for (i = 0; i < n; i ++)for (j = i + 1; j < n; j ++) {if (vis[i][j]) continue;ans = 0;for (k = 0; k < n; k ++) {if (p[k].y * (p[i].x - p[j].x) == (p[i].y - p[j].y) * p[k].x + p[j].y * p[i].x - p[i].y * p[j].x) {mark[ans ++] = k;for (l = 0; l < ans - 1; l ++)vis[k][mark[l]] = vis[mark[l]][k] = 1;}}if (max < ans)max = ans;}printf("%d\n", max);if (t) printf("\n");}return 0;}