尝试查找数组中点之间的最小距离时随机垃圾输出

Random garbage ouput when trying to find the minimum distance between points in an array

闹什么?

我试图找到点之间的最小距离(二维平面中两点之间的距离:与 (x1, y1) to (y1, y2)) 的距离,它们存储在数组 arr 中,然后计算并 return 这些距离的最小值。

但是,问题是我的源代码产生随机垃圾输出。

想法是用公式得到点 (x1, y1) and (x2, y2) 之间的距离: sqrt((x1 - x2)^2 + (y1 - y2)^2)。 为此,我为每次迭代 select 4 个元素: x1 = arr[0], x2 = arr[1], y1 = arr[2], y2 = arr[3]x1x2 对于每次迭代(i)保持不变,而 x1, x2y1, y2 之间的距离(对于 j) 进行计算。最后,选择两点之间的最短距离,并return编辑为main()

我做了什么来解决这个问题?

在源代码中包含调试语句表明,罪魁祸首是随机垃圾值(字面上根本不应该存在!)。

另一个罪魁祸首是 sqrt(arg) 给出了一个随机的垃圾值。例如计算(4, 4)(1, 100)之间的距离时,结果是sqrt(0 + (-99)^2) = 99。但是它输出 -2147483648.

这是我的代码:

#include<iostream>
#include<vector>
#include<cmath>
using std::sqrt;
using std::cin;
using std::cout;
using std::endl;
using std::vector;
int dist_cal(vector<int>&, int);

int main()
{
    int num_pairs = -1;
    cout << "Enter the number of pairs of point co-ordinates (x, y) that you want to enter: " << endl;
    cin >> num_pairs;

    vector<int> points;
    cout << "Now enter the (x, y) co-ordinate pairs: " << endl;
    for (int i = 0; i < num_pairs * 2; i++)
    {
        int buff;
        cin >> buff;
        points.push_back(buff);
    }

    cout << "The minimum distance between the array of points entered is " << dist_cal(points, num_pairs) << "." << endl;
    return 0;
}

int dist_cal(vector<int>& arr, int num_pairs)
{
    int min_distance = -1, temp_distance = -1, x1, x2, y1, y2, itr_count = 0;
    for (int i = 0; i <= num_pairs; i += 2)
    {
        x1 = arr[i + 0];
        x2 = arr[i + 1];
        for (int j = i + 2; j <= num_pairs; j += 2)
        {
            y1 = arr[j + 0];
            y2 = arr[j + 1];
            temp_distance = sqrt((x1 - x2)^2 + (y1 - y2)^2);
            if (itr_count == 0)
            {
                min_distance = temp_distance;
                itr_count++;
            }
            if (min_distance > temp_distance)
            {
                min_distance = temp_distance;
            }
        }
    }
    return min_distance;
}

我知道这个方法很幼稚,复杂度为 O(n^2),但要转向更快的算法,我必须首先用最基本的方法来解决它,以保持心理健康。

对于输入:

4
4 4
7 8
1 100
4 4

输出应该是 0.

实际输出为: The minimum distance between the array of points entered is -2147483648.

我在这里做错了什么?也欢迎替代(和更有效的算法)!提前致谢! :)

在C++中^表示异或按位运算,如果要x1-x2的2次方,可以这样写:(x1-x2) * (x1 - x2)或者使用std::pow函数.

所以这个

sqrt((x1 - x2)^2 + (y1 - y2)^2);

应该是:

sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2));

另一个问题,sqrt returns 实数所以 min_distancetemp_distance 应该是 doublefloat.


您的矢量以这种形式保存坐标:x(i),y(i),..

所以这个读

    x1 = arr[i + 0];
    x2 = arr[i + 1];

是错误的,应该是:

    x1 = arr[i + 0];
    y1 = arr[i + 1];

在内部循环中做同样的事情。


你的内部循环也应该从 0 索引开始。并且您必须检测到针对给定的 p 点计算 distance(p,p)(它始终为 0)并跳过此迭代的情况。然后你会计算所有的距离。

除了 建议的修复之外,要使此源代码正常工作,还必须进行另一项更改:

for (int j = i + 2; j <= num_pairs; j += 2)

实际上应该是:

for (int j = i + 2; j <= num_pairs + 2; j += 2)

这是因为对于 4 对的输入,i 最多可以达到值 4(数组大小:0 -> 7 ).由于 j 也依赖于 i,所以在 i 上总共执行了 4 次增量。所以i最多只能是4,所以x1 = 4, x2 = 5, y1 = 6,还有y2 = 7。另一方面,对于 4 对的输入(数组大小:0 -> 7),j 最多可以是 6。这是因为如果 i == 4j == 6,则 y1 = 6y2 = 7,这是向量 points 中的最后一个索引。