如果存在多个最接近的对,则找到所有最近点对

时间:2015-01-01 11:15:40

标签: c++

以下代码用于在使用C ++ liang教科书编程简介中查找最接近的点对问题。我试图编辑它,以便在存在多个最接近的对时找到所有最近的点对。

#include <iostream>
#include <cmath>
using namespace std;

/** Compute the distance between two points (x1, y1) and (x2, y2) */
double getDistance(double x1, double y1, double x2, double y2)
{
    return sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
}

int main()
{
    const int NUMBER_OF_POINTS = 8;

    // Each row in points represents a point
    double points[NUMBER_OF_POINTS][2];

    cout << "Enter " << NUMBER_OF_POINTS << " points: ";
    for (int i = 0; i < NUMBER_OF_POINTS; i++)
        cin >> points[i][0] >> points[i][1];

    // p1 and p2 are the indices in the points array
    int p1 = 0, p2 = 1; // Initial two points
    double shortestDistance = getDistance(points[p1][0], points[p1][1],
                                      points[p2][0], points[p2][1]); // Initialize          

    // Compute distance for every two points
    for (int i = 0; i < NUMBER_OF_POINTS; i++)
    {
    for (int j = i + 1; j < NUMBER_OF_POINTS; j++)
    {
        double distance = getDistance(points[i][0], points[i][1],
                                      points[j][0], points[j][1]); // Find distance

        if (shortestDistance > distance)
        {
            p1 = i; // Update p1
            p2 = j; // Update p2
            shortestDistance = distance; // Update shortestDistance
        }
    }
    }

    // Display result
    cout << "The closest two points are " <<
    "(" << points[p1][0] << ", " << points[p1][1] << ") and (" <<
    points[p2][0] << ", " << points[p2][1] << ")";

    return 0;

}

我通过使用一个新的数组,距离点来解决它,并且每当计算距离时保存与点对的距离,之后我循环遍历新阵列并打印出最短距离,但我认为有更确定的智能解决方案,我在编程方面相当新鲜:)

double distance_points[28][5];
int f = 0 ;
// Compute distance for every two points
for (int i = 0; i < NUMBER_OF_POINTS; i++)
{
    for (int j = i + 1; j < NUMBER_OF_POINTS; j++)
    {

        double distance = getDistance(points[i][0], points[i][1],
                                      points[j][0], points[j][1]); // Find distance
        distance_points[f][0] = distance;
        distance_points[f][1] = points[i][0];
        distance_points[f][2] = points[i][1];
        distance_points[f][3] = points[j][0];
        distance_points[f][4] = points[j][1];
        f++;
    }
 }

1 个答案:

答案 0 :(得分:0)

您可以将算法更改为向量中的结果:

std::vector<int> p1, p2;
double shortestDistance = getDistance(points[p1][0], points[p1][1],
                                  points[p2][0], points[p2][1]); // Initialize          

for (int i = 0; i < NUMBER_OF_POINTS; i++) {
    for (int j = i + 1; j < NUMBER_OF_POINTS; j++) {
        const double distance = getDistance(points[i][0], points[i][1],
                                            points[j][0], points[j][1]);

        if (shortestDistance >= distance) {
            if (shortestDistance > distance) {
                p1.clear();
                p2.clear();
                shortestDistance = distance; // Update shortestDistance
            }
            p1.push_back(i); // Update p1
            p2.push_back(j); // Update p2
        }
    }
}