Pagini recente » Cod sursa (job #1648111) | Cod sursa (job #453112) | Cod sursa (job #3196244) | Cod sursa (job #2084317) | Cod sursa (job #1825508)
package puncte;
import java.io.File;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import puncte.Ex4.V3Ex4.Punct;
public class Main {
static double bruteForce(Puncte P[], int s, int f)
{
double min = 1000000000;
for (int i = s; i < f; ++i)
for (int j = i+1; j < f; ++j)
if (P[i].distanta(P[j]) < min)
min = P[i].distanta(P[j]);
return min;
}
static double min(double x, double y)
{
return (x < y)? x : y;
}
static double DI(Puncte p[],int st ,int dr)
{
double d=0.0;
if (dr-st < 4){
return bruteForce(p, st, dr);
//d = min(perechi de elemente din X[st..dr])
}
else{
int mid=(st+dr)/2;
//SY= mulțimea punctelor din Y ∩ X[st..mij]
// DY= mulțimea punctelor din Y ∩ X[mij+1..dr]
double d1=DI(p, st, mid);
double d2=DI(p, mid+1,dr);
d=min(d1, d2);
//LY= Y ∩ banda (cu abscisa la distanta < d de abscisa punctului X[mid])
double d3=0.0;
double yMin = mid - d1, yMax = mid + d2;
Puncte[] newV = null;
newV= makeInY(p, yMin, yMax);
d3 = bruteForce(newV, 0, newV.length);
//vkgucgcgc
//calculează d3 considerând punctele p din LY si perechile formate de p cu fiecare din
//cele 7 puncte care îi urmează în LY
d=min(d, d3);
}
return d;
}
static Puncte[] makeInY(Puncte v[], double x1, double x2) {
Puncte[] newV = new Puncte[0];
for (int i = 0; i < v.length;i++) {
if ((v[i].getY() >= x1) && (v[i].getY() <= x2)) {
newV = Arrays.copyOf(newV, newV.length + 1);
newV[newV.length-1] = new Puncte(v[i].getX(),v[i].getY());
}
}
return newV;
}
public static void toString(Puncte p[]){
String s;
for(int i=0;i<p.length;i++)
System.out.println(p[i].getX()+" "+p[i].getY());
}
public static void main(String[] args) {
Puncte[] puncte = null;
try{
File file = new File("src/puncte/cmap.in");
Scanner input = new Scanner(file);
puncte = new Puncte[input.nextInt()];
for (int i = 0; i < puncte.length; i++) {
int x=input.nextInt();
int y=input.nextInt();
puncte[i] = new Puncte(x,y);
}
Arrays.sort(puncte);
//toString(puncte);
//double no=bruteForce(puncte, 0, puncte.length);
double no = DI(puncte, 0, puncte.length);
DecimalFormat dec = new DecimalFormat("#0.000000");
System.out.println(dec.format(no));
input.close();
}catch(Exception e){
System.out.println(e);
}
}
}