the original point is considered as the (0,0);
#include <iostream> // std::cout #include <algorithm> // std::make_heap, std::pop_heap, std::push_heap, std::sort_heap #include <vector> // std::vector #include <unordered_map> #include <map> #include <numeric> #include <list> #include <numeric> #include <utility> //key point //use multimap < distance , point > to store <distance , point> pair in ascending order . //then out the points with Kth distance. using namespace std; struct point{ int x; int y; point(int x, int y ):x(x),y(y){} }; list<point> KclosePoint (list<point>& points, int K ){ if ( points.empty()) return list<point>(); if (points.size () < K) return points; multimap<float , point> dist; for (auto& e: points){ // the distance will be sorted automatically dist.insert( make_pair (sqrt(pow(e.x,2) + pow(e.y,2)), e)); } for (auto& e: dist) cout <<" dist "<< e.first << endl; list<point> res; int index =0; auto itor = dist.begin(); while (index < K){ res.push_back(itor->second); itor++; index++; } return res; } int main () { list<point> in = {{9,9}, {10,10},{1,1},{2,2},{3,3},{4,4},{5,5}}; //sort(in.begin(),in.end()); auto out = KclosePoint(in,0); for (auto& e: out ) cout<< e.x <<" " << e.y << endl; return 0; }