// A recursive function to find the smallest distance. The array Px contains
// all points sorted according to x coordinates and Py contains all points
// sorted according to y coordinates
float closestUtil( Point Px[ ] , Point Py[ ] , int n)
{
// If there are 2 or 3 points, then use brute force
if ( n <= 3 )
return bruteForce( Px, n) ;
// Find the middle point
int mid = n/ 2 ;
Point midPoint = Px[ mid] ;
// Divide points in y sorted array around the vertical line.
// Assumption: All x coordinates are distinct.
std:: cout << "mid = " << mid;
int size_a = mid + 1 ;
int size_b = n - mid - 1 ;
Point * Pyl = new Point[ size_a] ; // y sorted points on left of vertical line
Point * Pyr = new Point[ size_b] ; // y sorted points on right of vertical line
int li = 0 , ri = 0 ; // indexes of left and right subarrays
for ( int i = 0 ; i < n; i++ )
{
if ( Py[ i] .x <= midPoint.x )
Pyl[ li++ ] = Py[ i] ;
else
Pyr[ ri++ ] = Py[ i] ;
}
// Consider the vertical line passing through the middle point
// calculate the smallest distance dl on left of middle point and
// dr on right side
float dl = closestUtil( Px, Pyl, mid) ;
float dr = closestUtil( Px + mid, Pyr, n- mid) ;
// Find the smaller of two distances
float d = min( dl, dr) ;
// Build an array strip[] that contains points close (closer than d)
// to the line passing through the middle point
Point * strip = new Point[ n] ;
int j = 0 ;
for ( int i = 0 ; i < n; i++ )
if ( abs ( Py[ i] .x - midPoint.x ) < d)
strip[ j] = Py[ i] , j++ ;
// Find the closest points in strip. Return the minimum of d and closest
// distance is strip[]
return min( d, stripClosest( strip, j, d) ) ;
}
Ly8gQSByZWN1cnNpdmUgZnVuY3Rpb24gdG8gZmluZCB0aGUgc21hbGxlc3QgZGlzdGFuY2UuIFRoZSBhcnJheSBQeCBjb250YWlucwoJLy8gYWxsIHBvaW50cyBzb3J0ZWQgYWNjb3JkaW5nIHRvIHggY29vcmRpbmF0ZXMgYW5kIFB5IGNvbnRhaW5zIGFsbCBwb2ludHMKCS8vIHNvcnRlZCBhY2NvcmRpbmcgdG8geSBjb29yZGluYXRlcwoJZmxvYXQgY2xvc2VzdFV0aWwoUG9pbnQgUHhbXSwgUG9pbnQgUHlbXSwgaW50IG4pCgl7CgkJLy8gSWYgdGhlcmUgYXJlIDIgb3IgMyBwb2ludHMsIHRoZW4gdXNlIGJydXRlIGZvcmNlCgkJaWYgKG4gPD0gMykKCQkJcmV0dXJuIGJydXRlRm9yY2UoUHgsIG4pOwoKCQkvLyBGaW5kIHRoZSBtaWRkbGUgcG9pbnQKCQlpbnQgbWlkID0gbi8yOwoJCVBvaW50IG1pZFBvaW50ID0gUHhbbWlkXTsKCgoJCS8vIERpdmlkZSBwb2ludHMgaW4geSBzb3J0ZWQgYXJyYXkgYXJvdW5kIHRoZSB2ZXJ0aWNhbCBsaW5lLgoJCS8vIEFzc3VtcHRpb246IEFsbCB4IGNvb3JkaW5hdGVzIGFyZSBkaXN0aW5jdC4KCQlzdGQ6OmNvdXQgPDwgIm1pZCA9ICIgPDwgbWlkOwoJCWludCBzaXplX2EgPSBtaWQgKyAxOwoJCWludCBzaXplX2IgPSBuIC0gbWlkIC0gMTsKCQlQb2ludCAqUHlsID0gbmV3IFBvaW50W3NpemVfYV07ICAgLy8geSBzb3J0ZWQgcG9pbnRzIG9uIGxlZnQgb2YgdmVydGljYWwgbGluZQoJCVBvaW50ICpQeXIgPSBuZXcgUG9pbnRbc2l6ZV9iXTsgIC8vIHkgc29ydGVkIHBvaW50cyBvbiByaWdodCBvZiB2ZXJ0aWNhbCBsaW5lCgkJaW50IGxpID0gMCwgcmkgPSAwOyAgLy8gaW5kZXhlcyBvZiBsZWZ0IGFuZCByaWdodCBzdWJhcnJheXMKCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKCQl7CgkJICBpZiAoUHlbaV0ueCA8PSBtaWRQb2ludC54KQoJCQkgUHlsW2xpKytdID0gUHlbaV07CgkJICBlbHNlCgkJCSBQeXJbcmkrK10gPSBQeVtpXTsKCQl9CgoJCS8vIENvbnNpZGVyIHRoZSB2ZXJ0aWNhbCBsaW5lIHBhc3NpbmcgdGhyb3VnaCB0aGUgbWlkZGxlIHBvaW50CgkJLy8gY2FsY3VsYXRlIHRoZSBzbWFsbGVzdCBkaXN0YW5jZSBkbCBvbiBsZWZ0IG9mIG1pZGRsZSBwb2ludCBhbmQKCQkvLyBkciBvbiByaWdodCBzaWRlCgkJZmxvYXQgZGwgPSBjbG9zZXN0VXRpbChQeCwgUHlsLCBtaWQpOwoJCWZsb2F0IGRyID0gY2xvc2VzdFV0aWwoUHggKyBtaWQsIFB5ciwgbi1taWQpOwoKCQkvLyBGaW5kIHRoZSBzbWFsbGVyIG9mIHR3byBkaXN0YW5jZXMKCQlmbG9hdCBkID0gbWluKGRsLCBkcik7CgoJCS8vIEJ1aWxkIGFuIGFycmF5IHN0cmlwW10gdGhhdCBjb250YWlucyBwb2ludHMgY2xvc2UgKGNsb3NlciB0aGFuIGQpCgkJLy8gdG8gdGhlIGxpbmUgcGFzc2luZyB0aHJvdWdoIHRoZSBtaWRkbGUgcG9pbnQKCQlQb2ludCAqc3RyaXAgPSBuZXcgUG9pbnRbbl07CgkJaW50IGogPSAwOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQoJCQlpZiAoYWJzKFB5W2ldLnggLSBtaWRQb2ludC54KSA8IGQpCgkJCQlzdHJpcFtqXSA9IFB5W2ldLCBqKys7CgoJCS8vIEZpbmQgdGhlIGNsb3Nlc3QgcG9pbnRzIGluIHN0cmlwLiAgUmV0dXJuIHRoZSBtaW5pbXVtIG9mIGQgYW5kIGNsb3Nlc3QKCQkvLyBkaXN0YW5jZSBpcyBzdHJpcFtdCgkJcmV0dXJuIG1pbihkLCBzdHJpcENsb3Nlc3Qoc3RyaXAsIGosIGQpICk7Cgl9
compilation info
prog.cpp:4:20: error: 'Point' was not declared in this scope
float closestUtil(Point Px[], Point Py[], int n)
^
prog.cpp:4:32: error: 'Point' was not declared in this scope
float closestUtil(Point Px[], Point Py[], int n)
^
prog.cpp:4:44: error: expected primary-expression before 'int'
float closestUtil(Point Px[], Point Py[], int n)
^
prog.cpp:4:49: error: expression list treated as compound expression in initializer [-fpermissive]
float closestUtil(Point Px[], Point Py[], int n)
^
prog.cpp:5:2: error: expected ',' or ';' before '{' token
{
^
stdout