Cod sursa(job #1825529)

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

	
}