Cod sursa(job #1825508)

Utilizator ioana30petrovai ioana ioana30 Data 9 decembrie 2016 11:58:53
Problema Cele mai apropiate puncte din plan Scor 0
Compilator java Status done
Runda Arhiva educationala Marime 2.68 kb
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);
			}
		
	}

}