ZZULIOJ 1196: 数星星(二)(结构体专题),Java
题目描述
一天,小明坐在院子里数星星,Gardon就出了个难题给他,让他数数天上的星星最多有多少个是在同一条直线上的。天上的星星太多了,小明马上就看花了眼,你能写个程序来帮他计算么?
输入
首先输入一个整数N(N<=300),接下来的N对数每对表示一个星星的位置(星星的坐标在-10000到10000之间,精确到小数点后1位)。没有两个星星会在同一个位置。
输出
一个整数,表示一条直线上最多星星的数目。
样例输入 Copy
5
0 0
1 0
1 1
0 1
0.5 0.5
样例输出 Copy
3
import java.util.HashMap;
import java.util.Scanner;
class Point {
double x;
double y;
public Point(double x, double y) {
this.x = x;
this.y = y;
}
}
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); // Number of stars
Point[] points = new Point[n];
for (int i = 0; i < n; i++) {
double x = sc.nextDouble();
double y = sc.nextDouble();
points[i] = new Point(x, y);
}
int maxCount = 2; // At least 2 points are on the same line
for (int i = 0; i < n; i++) {
HashMap<Double, Integer> slopeCounts = new HashMap<>();
int samePointCount = 0;
for (int j = 0; j < n; j++) {
if (i != j) {
double deltaX = points[j].x - points[i].x;
double deltaY = points[j].y - points[i].y;
double slope = deltaX == 0 ? Double.MAX_VALUE : deltaY / deltaX;
slopeCounts.put(slope, slopeCounts.getOrDefault(slope, 1) + 1);
maxCount = Math.max(maxCount, slopeCounts.get(slope));
if (points[j].x == points[i].x && points[j].y == points[i].y) {
samePointCount++;
}
}
}
maxCount = Math.max(maxCount, samePointCount);
}
System.out.println(maxCount);
}
}