Problem C: 质心算法

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

1
5
0 0
1 1
2 2
3 3
4 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 Code

append.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;
}

  

原文地址:https://www.cnblogs.com/Jie-Fei/p/9125647.html

时间: 2024-11-10 20:25:10

Problem C: 质心算法的相关文章

实验8:Problem C: 质心算法

注明一点:这个代码不是我写的,是我跟别人要的,我的程序一直没得到想要的输出结果,水平有限,实在不知道错误在哪 Home Web Board ProblemSet Standing Status Statistics Problem C: 质心算法 Problem C: 质心算法 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 649  Solved: 301[Submit][Status][Web Board] Description 在很多应用中,

hdu5371 Hotaru&#39;s problem(manacher 算法+枚举)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5371 题目大意:给一串数字,在子串中找到"1-2-1"的形式,其中1和2 是回文串,找出最长的那一串. 思路:利用manacher算法得出最长序列.观察子串形式,1和2是回文串,其实2和后面那个1也是回文串. 在之前我们已经通过manacher算法得到了每个数字所能延伸的长度,所以我们只要枚举第二段到第三段的距离即可. 当遇到第i个数字时,那么第二段和第三段的距离就是i+p[i],令j=i

HDU Hotaru&#39;s problem(Manacher算法+贪心)

manacher算法详见 http://blog.csdn.net/u014664226/article/details/47428293 题意:给一个序列,让求其最大子序列,这个子序列由三段组成,第一段和第二段对称,第一段和第三段一样. 思路:首先利用Manacher算法求出以任意两个相邻元素为中心的回文串长度,用a[i]表示i-1,i为中心的回文串长度的一半, 那么问题就转化成了求最大的x,使得a[i]>=x,a[i+x]>=x,这一步可以贪心来做. 将a[i]从大到小排序(间接排序保留

uva 101 The Blocks Problem (基本算法-模拟)

 The Blocks Problem  Background Many areas of Computer Science use simple, abstract domains for both analytical and empirical studies. For example, an early AI study of planning and robotics (STRIPS) used a block world in which a robot arm performed

WOJ 1047 LCS problem (LCS 算法总结 )

http://acm.whu.edu.cn/land/problem/detail?problem_id=1047 Description Recently, Flymouse reads a book about Algorithm and Data Structure. The book reads: there are two types of LCS Problems. One is Longest Common Subsequence problem. By the way of Dy

hdu 5284 wyh2000 and a string problem(没有算法,只考思维,字符数组得开20万,不然太小了)

代码: #include<cstdio> #include<cstring> using namespace std; char s[200000]; int main() { int t; scanf("%d",&t); while(t--) { scanf("%s",s); int w=0,y=0,h=0; int len=strlen(s); for(int i=0; i<len; i++) { if(w==0&&

【算法】N Queens Problem

/* ** 目前最快的N皇后递归解决方法 ** N Queens Problem ** 试探-回溯算法,递归实现 */ #include "stdafx.h" #include "iostream" #include <math.h> using namespace std; #include "time.h" // sum用来记录皇后放置成功的不同布局数:upperlim用来标记所有列都已经放置好了皇后. long sum = 0,

最近质心

算法很简单,取训练样本每种类别的平均值当做聚类中心点,待分类的样本离哪个中心点近就归属于哪个聚类 . 在<白话大数据与机器学习>里使用了sklearn里的NearestCentroid来处理数据: 训练模型 clf = NearestCentroid().fit(x, y) 预测数据 clf.predict(x) 这里我们来实现一下最近的质心算法,看看该算法具体是如果实现的. 1 准备数据 首先我们需要一些训练数据 这里使用鸢尾花数据 https://en.wikipedia.org/wiki

机器学习经典算法

函数名称均为sklearn库中的函数 1.线性回归算法:LinearRegression: 其中常用的有:Ridge:岭回归算法,MultiTaskLasso:多任务LASSO回归算法,ElasticNet:弹性网眼算法,LassoLars:LARS套索算法,OrthogonalMatchingPursuit:正交匹配追踪(OMP)算法, BayesianRidge:贝叶斯岭回归算法,LogisticRegression:逻辑回归算法,SGDClassifier:SGD随机梯度下降算法,Muti