Ultraviolet A 270 Lining Up (geometric joint points)

Source: Internet
Author: User

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;}

 

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.