点排序

题目描述

输入一组整数二维点坐标,对其进行排序后输出,大小规则定义如下:

  • 比较点坐标到原点距离,距离较小的点更小
  • 到原点距离相同时,比较x坐标,x较小的点更小
  • 到原点距离和x坐标均相同时,比较y坐标,y较小的点更小

补全 Point 类必要的代码,使得其可以利用 std::sort 完成排序。

关于输入

第一行,一个整数n。

接下来n行,每行两个整数xi,yi,表示第i个点的坐标。

关于输出

共2n行,每行两个整数。

前n行,将n个点从小到大依次输出坐标。

接下来n行,将n个点从大到小依次输出坐标。

核心技巧

  • 阅读 Cppreference 后可以得知,std::sort 按照 operator< 进行排序,因此需要重载该类的 < 运算符。

参考答案

#include <iostream>
#include <algorithm>
using std::cin, std::cout, std::endl;
class Point {
private:
    int x, y;
public:
    Point(): x{0}, y{0} {}
    friend std::istream& operator>>(std::istream& is, Point& p) {
        return is >> p.x >> p.y;
    }
    friend std::ostream& operator<<(std::ostream& os, const Point& p) {
        return os << p.x << ' ' << p.y;
    }
    bool operator< (const Point& p) const {
        if (x * x + y * y != p.x * p.x + p.y * p.y) {
            return x * x + y * y < p.x * p.x + p.y * p.y;
        }
        else if(x != p.x) {
            return x < p.x;
        }
        else {
            return y < p.y;
        }
    }
    bool operator> (const Point& p) const {
        return !((*this) < p);
    }
};
int main() {
    int n;
    cin >> n;
    Point* points = new Point[n];
    for (int i = 0; i < n; i++) {
        cin >> points[i];
    }
    std::sort(points, points + n);
    for (int i = 0; i < n; i++) {
        cout << points[i] << endl;
    }
    std::sort(points, points + n, std::greater());
    for (int i = 0; i < n; i++) {
        cout << points[i] << endl;
    }
    delete[] points;
}