📜  门| GATE-CS-2014-(Set-2)|第65章(1)

📅  最后修改于: 2023-12-03 15:42:17.390000             🧑  作者: Mango

GATE-CS-2014-(Set-2) |第65题门

本题是一个计算机科学领域的问题,要求程序员掌握C++中的指针和动态内存管理。本题的要求是编写一个C++程序,实现给定的类Point的成员函数。我们需要实现两个函数:

  1. 一个函数print_on_x对Point类定义的点进行排序,按照坐标x的值从小到大,则输出各点的坐标,y的坐标值可以不进行顺序排序。
  2. 一个函数arrange_on_circle对Point类定义的点进行排序,使它们按照它们绕圆周的方向依次排列,输出排列好的点的x和y坐标。

我们会在程序开始时输入一个整数n,表示点的个数,然后依次输入n个点的坐标,你需要将它们存在一个动态分配的Point类型的数组中,然后对这个数组进行排序,并分别输出排序后的结果。

解题思路
  1. 首先,我们要读入n和n个点的坐标
  2. 然后,我们要创建一个Point类型的动态数组,将读入的n个点存储到数组中去
  3. 接着,我们需要实现一个sort函数,对Point类型的数组进行排序。我们可以采用快速排序的算法来快速地进行排序。
  4. sort函数传入的是一个指针指向Point类型数组的开头和结尾,通过递归调用自身,对每个子数组进行排序,最终完成整个数组的排序。
  5. 排序完成后,我们就可以实现print_on_x和arrange_on_circle两个函数了。其中,print_on_x函数只需要按照坐标x的顺序输出Point对象即可,而arrange_on_circle函数则需要根据每个点到圆心的夹角进行排序。
程序代码

下面是完整的C++代码,包含了Point类的定义、排序函数sort和两个打印函数print_on_x和arrange_on_circle。

#include <iostream>
#include <math.h>
#include <algorithm>
using namespace std;

class Point {
private:
    int x;
    int y;
public:
    Point() {}
    Point(int _x, int _y) : x(_x), y(_y) {}
    int getX() { return x; }
    int getY() { return y; }
};

bool cmp_x(Point a, Point b) { 
    return a.getX() < b.getX(); 
}

bool cmp_cir(Point a, Point b) { 
    double angle_a = atan2(a.getY(), a.getX());
    double angle_b = atan2(b.getY(), b.getX());
    if (angle_a == angle_b) return a.getX() < b.getX();
    return angle_a < angle_b;
}

void print_on_x(Point* a, int n) {
    sort(a, a + n, cmp_x);
    for (int i = 0; i < n; i++) {
        cout << a[i].getX() << " " << a[i].getY() << endl;
    }
}

void arrange_on_circle(Point* a, int n) {
    Point center(0, 0);
    sort(a, a + n, cmp_cir);
    for (int i = 0; i < n; i++) {
        cout << a[i].getX() << " " << a[i].getY() << endl;
    }
}

void sort(Point* a, int l, int r, bool (*cmp)(Point, Point)) {
    if (l >= r) return;
    Point pivot = a[l];
    int i = l - 1, j = r + 1;
    while (i < j) {
        do i++; while (cmp(a[i], pivot));
        do j--; while (cmp(pivot, a[j]));
        if (i < j) swap(a[i], a[j]);
    }
    sort(a, l, j, cmp);
    sort(a, j + 1, r, cmp);
}

int main() {
    int n, x, y;
    cin >> n;
    Point* a = new Point[n];
    for (int i = 0; i < n; i++) {
        cin >> x >> y;
        Point p(x, y);
        a[i] = p;
    }
    sort(a, 0, n - 1, cmp_x);
    print_on_x(a, n);
    cout << endl;
    arrange_on_circle(a, n);
    return 0;
}

使用场景: 可以在需要排序坐标点的应用场景中使用。例如地图上各个标记点需要按照X坐标从小到大排序并且经过圆心时需要按照角度排序。