Правила[Одномерные массивы] 53. В одномерном массиве с четным количеством элементов (2N) находятся координаты N точек плоскости. Они располагаются в следующем порядке: x1, y1, х2, y2, x3, y3, и т.д. (xi, yi – целые). Определить номера точек, которые могут являться вершинами квадрата.
Хотелось как лучше, а получилось как всегда — гора условий… Самое сложное это как всегда адекватно проверить, но вроде работает и с учетом поворота оси квадрата. Вообщем надо было сначала залезть в геометрию, а не рисовать картину из треугольников. Итак Бермудский треугольник:
public static int getLengthSquared(int x1, int y1, int x2, int y2) {
return ((x1 - x2) * (x1 - x2)) + ((y1 - y2) * (y1 - y2));
}
public static boolean isAllIncluded(int[] p, int[] n) { // если такое решение уже имело место быть, планировалось передавать сюда по 8 элементов
label1:
for (int i = 0; i < n.length; i += 2) {
for (int j = 0; j < p.length; j += 2)
if ((n[i] == p[j] && n[i + 1] == p[j + 1]))
continue label1;
return false;
}
return true;
}
public static boolean isWas(int[] p, int[] n) { // формирование тех 8ми элементов, 4 вершины квадрата
for (int i = 0; i < p.length; i += 8)
if (isAllIncluded(Arrays.copyOfRange(p, i, i + 8), n))
return false;
return true;
}
public static int[] getIndexPointSquare(int... p) {
if (p.length < 8 || p.length % 2 != 0)
throw new IllegalArgumentException("Bad array");
int[] temp = new int[0];
for (int i = 0; i < p.length - 6; i += 2)
for (int k = i + 2; k < p.length - 4; k += 2)
for (int m = k + 2; m < p.length - 2; m += 2) {
int a = getLengthSquared(p[i], p[i + 1], p[k], p[k + 1]);
int b = getLengthSquared(p[i], p[i + 1], p[m], p[m + 1]);
int c = getLengthSquared(p[k], p[k + 1], p[m], p[m + 1]);
if ((((a == b + c) && b == c) ^ ((c == a + b) && a == b)) ^ ((b == a + c) && a == c)) // проверка чтобы выполнялось только 1 из 3 условий - треугольник с прямым углом + так как это квадрат оба катета равны
for (int j = i + 6; j < p.length; j
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
если самого маленького квадрата, куда входят все точки, то…