Возможно, кто-то напишет здесь код для вас, и я твердо верю, что он не заставит вас учиться, поэтому давайте попробуем понять, что происходит в алгоритме.
Итак, есть две вещи (которые вы могли бы пояснить в вопросе), но давайте разберем их здесь -
Поиск всех наборов коллинеарных точек на графике
Для фиксированной точки P
, реализующей алгоритм, который вы только что упомянули в вопросе.
Давайте сначала начнем с части 2: * Решение 1043 *, которое вы разместили, является излишним, вам вообще не нужно HashMaps
.
Рассмотрим этот фрагмент:
// declare Point P
class Point {
int x, y; //
double slope; // slope = y/x
}
double getSlope(Point a) {
return (double)(a.y - P.y) / (a.x - P.x);
}
// declare list of points as List<Point> ptList
Collections.sort(ptList, new Comparator<Point>() {
@Override
public int compare(Point a, Point b) {
return getSlope(a) < getSlope(b);
}
});
for(int i = 1; i < ptList.length(); i++) {
if(getSlope(ptList[i]) == getSlope(ptList[i - 1]) {
// this means points i, i - 1 have equal slopes
}
}
Это основано на том факте, что равные числа группируются после сортировки. Например, несортированный массив [0, 2, 1, 2, 0, 3, 1, 1]
будет выглядеть так после сортировки [0, 0, 1, 1, 1, 2, 2, 3]
и заметит, как равные элементы вместе.
Теперь часть 1: Нам нужно найти все такие наборы. Мы попытаемся сделать каждую точку в данном списке P
, а остальные точки, которые еще не обработаны, как установлено Q
. Используя описанную выше процедуру, мы можем разделить множества Q
на коллинеарные множества.
Когда вы сделали это для всех P
, все готово.
PS - Пожалуйста, не сравнивайте двойные значения напрямую, используя val1 == val2
из-за точности с плавающей запятой, это не удастся. Используйте пороговое сравнение, например absolute(val1 - val2) < 10^(-9)
Подробнее: https://howtodoinjava.com/java/basics/correctly-compare-float-double/