import java.util.*; import java.lang.*; import java.io.*; class My2dPoint { double x; double y; public My2dPoint(double x1, double y1) { x=x1; y=y1; } } class CompareByX implements Comparator { public int compare(My2dPoint p1, My2dPoint p2) { if (p1.x < p2.x) return -1; if (p1.x == p2.x) return 0; return 1; } } /* An object of the above comparator class is used by java.util.Arrays.sort() in main to sort an array of points by x-coordinates */ class Auxiliaries { public static double distSquared(My2dPoint p1, My2dPoint p2) { double result; result = (p1.x-p2.x)*(p1.x-p2.x) + (p1.y-p2.y)*(p1.y-p2.y); return result; } } public class HW3 { public static void main (String argv []) throws IOException { int range = 1000000; // Range of x and y coordinates in points System.out.println("Enter the number of points"); InputStreamReader reader1 = new InputStreamReader(System.in); BufferedReader buffer1 = new BufferedReader(reader1); String npoints = buffer1.readLine(); int numpoints = Integer.parseInt(npoints); // numpoints is now the number of points we wish to generate My2dPoint inputpoints [] = new My2dPoint [numpoints]; // array to hold points int closest [] = new int [numpoints]; // array to record soln; closest[i] is index of point closest to i'th int px, py; double dx, dy, dist; int i,j; double currbest; int closestPointIndex; long tStart, tEnd; for (i = 0; i < numpoints; i++) { px = (int) ( range * Math.random()); dx = (double) px; py = (int) (range * Math.random()); dy = (double) py; inputpoints[i] = new My2dPoint(dx, dy); } // array inputpoints has now been filled tStart = System.currentTimeMillis(); // find closest [0] closest[0] = 1; currbest = Auxiliaries.distSquared(inputpoints[0],inputpoints[1]); for (j = 2; j < numpoints; j++) { dist = Auxiliaries.distSquared(inputpoints[0],inputpoints[j]); if (dist < currbest) { closest[0] = j; currbest = dist; } } // now find closest[i] for every other i for (i = 1; i < numpoints; i++) { closest[i] = 0; currbest = Auxiliaries.distSquared(inputpoints[i],inputpoints[0]); for (j = 1; j < i; j++) { dist = Auxiliaries.distSquared(inputpoints[i],inputpoints[j]); if (dist < currbest) { closest[i] = j; currbest = dist; } } for (j = i+1; j < numpoints; j++) { dist = Auxiliaries.distSquared(inputpoints[i],inputpoints[j]); if (dist < currbest) { closest[i] = j; currbest = dist; } } } tEnd = System.currentTimeMillis(); System.out.println("Time taken in Milliseconds: " + (tEnd - tStart)); /* The following piece is just to test the program, and should be removed when running on large point sets */ /* for (i = 0; i < numpoints; i++) { System.out.println("Point " + i + ": " + inputpoints[i].x + " " + inputpoints[i].y + " closest is " + closest[i]); } */ /* The following is just to remind you of how to use a library Sort just in case you want to sort */ CompareByX c = new CompareByX(); java.util.Arrays.sort(inputpoints,c); } }