Problem C: 質心演算法

來源:互聯網
上載者:User

標籤:point   pen   ems   int   code   表示   BMI   gre   class   

Problem C: 質心演算法Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 2799  Solved: 1290
[Submit][Status][Web Board]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

見範例。

 

Sample Input
150 01 12 23 34 4

  

Sample Output
The Point (0.00, 0.00) is created!The Point (0.00, 0.00) is created!The Point (0.00, 0.00) is created!The Point (0.00, 0.00) is created!The Point (0.00, 0.00) is created!The Point (0.00, 0.00) is created!The Point (0.00, 0.00) is created!The Point (1.00, 1.00) is created!The Point (2.00, 2.00) is created!The Point (3.00, 3.00) is created!The Point (4.00, 4.00) is created!The Point (0.00, 0.00) is created!The Point (0.00, 0.00) is created!The Point (0.00, 0.00) is created!The Point (0.00, 0.00) is created!The Point (0.00, 0.00) is created!A graph with 5 points is created!The Point (2.00, 2.00) is created!A Point (2.00, 2.00) is copied!A Point (2.00, 2.00) is erased!The centroid is (2.00, 2.00).A Point (4.00, 4.00) is erased!A Point (3.00, 3.00) is erased!A Point (2.00, 2.00) is erased!A Point (1.00, 1.00) is erased!A Point (0.00, 0.00) is erased!A graph with 5 points is erased!A Point (4.00, 4.00) is erased!A Point (3.00, 3.00) is erased!A Point (2.00, 2.00) is erased!A Point (1.00, 1.00) is erased!A Point (0.00, 0.00) is erased!A Point (2.00, 2.00) is erased!

  

HINT

 

 當使用對象作為函數傳回值時,會產生一個臨時對象,此時會調用拷貝建構函式。但是在g++編譯器(也就是大家常用的code::blocks所用的編譯器)中,當函數返回的對象給另一個對象進行賦值時,如果函數傳回值是一個局部變數,則不會調用拷貝建構函式。所以,如果想在此程式中實現拷貝建構函式的調用,必須在getCentroid中返回一個使用new運算子建立的對象,而不是一個已經定義的局部對象。☆!!!!!!

 

Append Codeappend.cc, 
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;}

  

#include <iostream>#include <iomanip>using namespace std;class Point{public :    double x, y;    Point():x(0), y(0)    {        cout<<fixed<<setprecision(2)<<"The Point ("<<x<<", "<<y<<") is created!"<<endl;    }    Point(double a,double b):x(a), y(b)    {        cout<<"The Point ("<<x<<", "<<y<<") is created!"<<endl;    }    Point(const Point& p)    {        x=p.x; y=p.y;        cout<<"A Point ("<<x<<", "<<y<<") is copied!"<<endl;    }    double getX(){return x;}    double getY(){return y;}    ~Point()    {        cout<<"A Point ("<<x<<", "<<y<<") is erased!"<<endl;    }};class Graph{public :    Point *points;//必須要釋放,否則佔用空間且不會被析構    int numOfPoints;    Graph(Point *p, int n):numOfPoints(n)    {        points= new Point[n];        for(int i=0; i<n; i++)        {            points[i]=p[i];        }        cout<<"A graph with "<<numOfPoints<<" points is created!"<<endl;    }    Point getCentroid()    {        double x_=0, y_=0;        for(int i=0; i<numOfPoints; i++)        {            x_+=points[i].x;            y_+=points[i].y;        }        x_/=numOfPoints;        y_/=numOfPoints;        Point *p=new Point(x_,y_);        return *p;//指標只能存在於此域中,無法返回,返回過程中會發生拷貝。    }    ~Graph()    {        delete []points;        cout<<"A graph with "<<numOfPoints<<" points is erased!"<<endl;    }};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;}

  

Problem C: 質心演算法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.