typedef pair Punto; float distanciaAlCuadrado(const Punto & p1, const Punto & p2) { float a = p2.first - p1.first; float b = p2.second - p1.second; return a * a + b * b; } bool compararY(const Punto & p1, const Punto & p2) { return p1.second < p2.second; } float distanciaMinima(const vector & puntosX, const vector & puntosY) { int talla = puntosX.size(); if (talla == 2) return distanciaAlCuadrado(puntosX[0], puntosX[1]); if (talla == 3) return min({distanciaAlCuadrado(puntosX[0], puntosX[1]), distanciaAlCuadrado(puntosX[0], puntosX[2]), distanciaAlCuadrado(puntosX[1], puntosX[2])}); int tallaIzquierda = talla / 2, tallaDerecha = talla - tallaIzquierda; vector izquierdaX(tallaIzquierda), derechaX(tallaDerecha), izquierdaY(tallaIzquierda), derechaY(tallaDerecha); for (int i = 0; i < tallaIzquierda; i++) { izquierdaX[i] = puntosX[i]; izquierdaY[i] = puntosY[i]; } for (int i = 0; i < tallaDerecha; i++) { derechaX[i] = puntosX[i + tallaIzquierda]; derechaY[i] = puntosY[i + tallaIzquierda]; } float minima = min(distanciaMinima(izquierdaX, izquierdaY), distanciaMinima(derechaX, derechaY)); vector centro; float frontera = izquierdaX[tallaIzquierda - 1].first; for (int i = 0; i < talla; i++) if( abs(frontera - puntosY[i].first) < minima ) centro.push_back(puntosY[i]); for (int i = 0; i < centro.size() - 1; i++) minima = min(minima, distanciaAlCuadrado(centro[i], centro[i + 1])); return minima; } float distanciaMinima(const vector & puntos) { vector puntosX(puntos), puntosY(puntos); sort(puntosX.begin(), puntosX.end()); for (int i = 0; i < puntosX.size() - 1; i++) if (puntosX[i] == puntosX[i + 1]) return 0; sort(puntosY.begin(), puntosY.end(), compararY); return sqrt(distanciaMinima(puntosX, puntosY)); }