Pagini recente » Cod sursa (job #2639717) | Cod sursa (job #2399751) | Cod sursa (job #571553) | Cod sursa (job #574010) | Cod sursa (job #1825529)
package puncte;
import java.io.File;
import java.io.PrintStream;
import java.text.DecimalFormat;
import java.util.Arrays;
import java.util.Scanner;
public class Puncte implements Comparable<Puncte> {
int x, y;
public Puncte(int x, int y){
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public double distanta(Puncte A){
return Math.sqrt((A.x-this.x)*(A.x-this.x)+(A.y-this.y)*(A.y-this.y));
}
public int compareX(Puncte A)
{
return (A.x - this.x);
}
// Needed to sort array of points according to Y coordinate
public int compareY(Puncte A)
{
return (A.y - this.y);
}
public int compareTo(Puncte comparex) {
int compX = ((Puncte) comparex).getX();
//ascending order
return this.x - compX;
}
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");
PrintStream outFile = new PrintStream( "src/puncte/cmap.out" );
outFile.println(dec.format(no));
input.close();
outFile.close();
}catch(Exception e){
System.out.println(e);
}
}
}