Problem D: 质心算法

来源:互联网 发布:淘宝商品佣金查询 编辑:程序博客网 时间:2024/06/16 04:24

Problem D: 质心算法

Description

在很多应用中,需要对某个目标进行定位。比如对于一个未知坐标的点A,假定已知A点与N个点相邻,且已知N个相邻点的坐标,则可取N个点的质心作为A点坐标的一个估计值。

所谓质心,就是指其横坐标、纵坐标分别为N个点的横坐标平均值、纵坐标平均值的点。即:假定N个点的坐标分别(x1,y1),(x2,y2),......,则质心的坐标为((x1+x2+...)/N, (y1+y2+...)/N)。

现在需要你编写2个类:

1. Point类:包括一个点的横坐标和纵坐标,并提供适当的构造函数、析构函数和拷贝构造函数,以及getX()和getY()方法。

2. Graph类

(1)数据成员Point *points;表示与A点相邻的点的集合。

(2)数据成员:int numOfPoints;表示相邻点的个数。

(3)适当的构造函数、析构函数。

(4)Point getCentroid()方法:用于返回质心点。

注意:同一类的对象之间的赋值运算(=)不调用拷贝构造函数。

Input

输入为多行,第一行M>0表示有M个测试用例。

每个测试用例包含多行。第一行N>0表示有N个点,之后是N个点的横坐标和纵坐标,每个点占一行。

Output

见样例。

HINT

 当使用对象作为函数返回值时,会产生一个临时对象,此时会调用拷贝构造函数。但是在g++编译器(也就是大家常用的code::blocks所用的编译器)中,当函数返回的对象给另一个对象进行赋值时,如果函数返回值是一个局部变量,则不会调用拷贝构造函数。所以,如果想在此程序中实现拷贝构造函数的调用,必须在getCentroid中返回一个使用new运算符创建的对象,而不是一个已经定义的局部对象。


#include <iostream>#include <iomanip>using namespace std;class Point {private:    double x, y;public:    Point(double xx = 0.0, double yy = 0.0) : x(xx), y(yy) {        cout << "The Point ("<<setprecision(2)<<setiosflags(ios::fixed)<<x<<", "<<setprecision(2)<<setiosflags(ios::fixed)<<y<<") is created!" << endl;    }    Point(const Point &p) {        x = p.x, y = p.y;        cout << "A Point ("<<setprecision(2)<<setiosflags(ios::fixed)<<x<<", "<<setprecision(2)<<setiosflags(ios::fixed)<<y<<") is copied!" << endl;    }    ~Point() {        cout << "A Point ("<<setprecision(2)<<setiosflags(ios::fixed)<<x<<", "<<setprecision(2)<<setiosflags(ios::fixed)<<y<<") is erased!" << endl;    }    double getX() { return x; }    double getY() { return y; }};class Graph {    Point *points;    int numOfPoints;public:    Graph(Point *p, int num) : numOfPoints(num) {        points = new Point [num];        for (int i = 0; i < num; i++) {            points[i] = p[i];        }        cout << "A graph with "<<numOfPoints<<" points is created!" << endl;    }    ~Graph() {        delete [] points;        cout << "A graph with "<<numOfPoints<<" points is erased!" << endl;    }    Point getCentroid() {        double x = 0, y = 0;        for (int i = 0; i < numOfPoints; i++) {            x += points[i].getX();            y += points[i].getY();        }        x /= numOfPoints, y /= numOfPoints;        Point *p = new Point(x, y);        return *p;    }};int main(){    int cases,num;    double x, y;    Point centroid;    cin>>cases;    for (int i = 0; i < cases; i++)    {        cin>>num;        Point points[num];        for (int j = 0; j < num; j++)        {            cin>>x>>y;            points[j] = *(new Point(x, y));        }        Graph graph(points, num);        centroid = graph.getCentroid();        cout<<setprecision(2)<<fixed<<"The centroid is ("<<centroid.getX()<<", "<<centroid.getY()<<")."<<endl;    }    return 0;}


原创粉丝点击