点排序
题目描述
输入一组整数二维点坐标,对其进行排序后输出,大小规则定义如下:
- 比较点坐标到原点距离,距离较小的点更小
- 到原点距离相同时,比较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;
}