Я попробовал этот пример только с 4 пунктов, она работает с:В файле с 10 000 точками формы X1 y1 X2 y2 ,,, Как определить не менее 4, которые образуют квадрат? Java
-1 -1
4 -2
1 -4
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class CarreSimple {
static int distance(Point point1, Point point2) {
int dist = (int) (Math.pow(point1.getX() - point2.getX(), 2) + Math.pow(point1.getY() - point2.getY(), 2));
dist = (int) Math.sqrt(dist);
return dist;
}
public static void main(String[] args) {
boolean EstCarre = false;
Point[] tb = new Point[10000];
int i = 0;
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader("C:/Users/walid/Downloads/points.txt"));
String line;
while ((line = br.readLine()) != null) {
String[] parts = line.split(" ");
int part1 = Integer.parseInt(parts[0]);
int part2 = Integer.parseInt(parts[1]);
Point p = new Point(part1, part2);
tb[i] = p;
System.out.println("X " + tb[i].getX() + " y " + tb[i].getY());
i++;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null) {
br.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
int[] distances = new int[3];
distances[0] = distance(tb[0], tb[1]);
distances[1] = distance(tb[0], tb[2]);
distances[2] = distance(tb[0], tb[3]);
System.out.println(distances[0]);
int CoteEgal1 = -1;
int CoteEgal2 = -1;
int CotePasEgal = -1;
if (distances[0] == distances[1]) {
if (distances[0] != distances[2]) {
CoteEgal1 = 0;
CoteEgal2 = 1;
CotePasEgal = 2;
}
} else if (distances[1] == distances[2]) {
if (distances[1] != distances[0]) {
CoteEgal1 = 1;
CoteEgal2 = 2;
CotePasEgal = 0;
}
} else if (distances[0] == distances[2]) {
if (distances[0] != distances[1]) {
CoteEgal1 = 0;
CoteEgal2 = 2;
CotePasEgal = 1;
}
}
if (CoteEgal1 != -1) {
int coinOpposÈ = 0;
switch (CotePasEgal) {
case 0:
coinOpposÈ = distance(tb[2], tb[3]);
break;
case 1:
coinOpposÈ = distance(tb[1], tb[3]);
break;
case 2:
coinOpposÈ = distance(tb[1], tb[2]);
break;
default:
break;
}
if (coinOpposÈ == distances[CotePasEgal]) {
int diagonal = coinOpposÈ;
int adjacent = distances[CoteEgal1];
boolean stillOK = true;
for (int a = 0; a < 4; a++) {
int diagonalCount = 0;
int adjacentCount = 0;
for (int b = 0; b < 4; b++) {
if (a != b) {
int dist = distance(tb[a], tb[b]);
if (dist == diagonal) {
diagonalCount++;
} else if (dist == adjacent) {
adjacentCount++;
}
}
}
// est ce que on a 1 diagonal et 2 adjacents
if (!(diagonalCount == 1 && adjacentCount == 2)) {
stillOK = false;
break;
}
}
if (stillOK) {
EstCarre = true;
}
}
}
if (EstCarre) {
System.out.println("C'est un carre");
} else {
System.out.println("Ce n'est pas un carre");
}
}
}
К сделайте петлю на файле в 10 000 очков и проверьте каждую комбинацию 4, которую я нашел слишком сложной.
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class Square {
static int distance(Point point1, Point point2) {
int dist = (int) (Math.pow(point1.getX() - point2.getX(), 2) + Math.pow(point1.getY() - point2.getY(), 2));
dist = (int) Math.sqrt(dist);
return dist;
}
public static void main(String[] args) {
boolean EstCarre = false;
Point[] tb = new Point[10000];
int i = 0;
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader("C:/Users/walid/Downloads/exercice.txt"));
String line;
while ((line = br.readLine()) != null) {
String[] parts = line.split(" ");
int part1 = Integer.parseInt(parts[0]);
int part2 = Integer.parseInt(parts[1]);
Point p = new Point(part1, part2);
tb[i] = p;
System.out.println("X " + tb[i].getX() + " y " + tb[i].getY());
i++;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null) {
br.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
for (int i2 = 0; i2 < 10000; i2++) {
for (int j = 0; j < 10000; j++) {
for (int k = 0; k < 10000; k++) {
for (int l = 0; l < 10000; l++) {
if (i2 != j && i2 != k && i2 != l && j != k && j != l && k != l) {
int[] distances = new int[10000000];
distances[i2] = distance(tb[i2], tb[j]);
distances[j] = distance(tb[i2], tb[k]);
distances[k] = distance(tb[i2], tb[l]);
int CoteEgal1 = -1;
int CoteEgal2 = -1;
int CotePasEgal = -1;
if (distances[i2] == distances[j]) {
if (distances[i2] != distances[k]) {
CoteEgal1 = i2;
CoteEgal2 = j;
CotePasEgal = k;
}
} else if (distances[i2] == distances[k]) {
if (distances[j] != distances[i2]) {
CoteEgal1 = j;
CoteEgal2 = k;
CotePasEgal = i2;
}
} else if (distances[i2] == distances[k]) {
if (distances[i2] != distances[j]) {
CoteEgal1 = i2;
CoteEgal2 = k;
CotePasEgal = j;
}
}
int coinOpposÈ = 0;
if (CoteEgal1 != -1) {
if (CotePasEgal == i2) {
coinOpposÈ = distance(tb[k], tb[l]);
} else if (CotePasEgal == j) {
coinOpposÈ = distance(tb[j], tb[l]);
} else if (CotePasEgal == k) {
coinOpposÈ = distance(tb[j], tb[k]);
}
if (coinOpposÈ == distances[CotePasEgal]) {
int diagonal = coinOpposÈ;
int adjacent = distances[CoteEgal1];
boolean stillOK = true;
for (int a = 0; a < 10000000; a++) {
int diagonalCount = 0;
int adjacentCount = 0;
for (int b = 0; b < 10000000; b++) {
if (a != b) {
int dist = distance(tb[a], tb[b]);
if (dist == diagonal) {
diagonalCount++;
} else if (dist == adjacent) {
adjacentCount++;
}
}
}
// est ce que on a 1 diagonal et 2 adjacents
if (!(diagonalCount == 1 && adjacentCount == 2)) {
stillOK = false;
break;
}
}
if (stillOK) {
EstCarre = true;
}
}
}
}
if (EstCarre) {
System.out.println("square found");
}
}
}
}
}
}
}
код 2: пара это класс, который занимает две точки
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import java.util.HashMap;
import java.util.Set;
public class CarreP {
public static void main(String[] args) {
Point[] tb = new Point[10000];
int i = 0;
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader("C:/Users/walid/Downloads/exercice.txt"));
String line;
while ((line = br.readLine()) != null) {
String[] parts = line.split(" ");
int part1 = Integer.parseInt(parts[0]);
int part2 = Integer.parseInt(parts[1]);
Point p = new Point(part1, part2);
tb[i] = p;
i++;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null) {
br.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
HashMap<Couple, Integer> hmap = new HashMap<Couple, Integer>();
int j = 0;
while (j < tb.length) {
for (int k = 0; k < tb.length; k++) {
int xcarre = (int) Math.pow(tb[j].getX() - tb[k].getX(), 2);
int ycarre = (int) Math.pow(tb[j].getY() - tb[k].getY(), 2);
int distance = (int) Math.sqrt(xcarre + ycarre);
Couple c = new Couple(tb[k], tb[k]);
hmap.put(c, distance);
Set set = hmap.entrySet();
Iterator iterator = set.iterator();
Iterator iterator2 = set.iterator();
int[] distances = new int[hmap.size()];
int s = 0;
while (iterator.hasNext()) {
Map.Entry mentry = (Map.Entry) iterator.next();
distances[s] = (int) mentry.getValue();
System.out.println(distances[s]);
s++;
}
int CoteEgal1 = -1;
int CoteEgal2 = -1;
int CoteInegal = -1;
for (int i1 = 0; i1 < distances.length; i1++) {
for (int i2 = 0; i2 < distances.length; i2++) {
for (int i3 = 0; i3 < distances.length; i3++) {
if (distances[i1] == distances[i2]) {
if (distances[i1] != distances[i3]) {
CoteEgal1 = i1;
CoteEgal2 = i2;
CoteInegal = i3;
}
} else if (distances[i2] == distances[i3]) {
if (distances[i2] != distances[i1]) {
CoteEgal1 = i2;
CoteEgal2 = i3;
CoteInegal = i1;
}
} else if (distances[i1] == distances[i3]) {
if (distances[i1] != distances[i2]) {
CoteEgal1 = i1;
CoteEgal2 = i3;
CoteInegal = i2;
}
}
}
}
}
}
}
}
}
Другими словами, вы хотите простой метод, проверьте, есть ли четыре координаты создать квадрат? – SteelToe
@ MarrieteCowby12 да, из 10000 пунктов в файле с формой –
Есть ли какая-либо структура для ваших данных, потому что итерация по всем точкам грубой силой может быть неэффективной? –