Я реализую простой жадный алгоритм слияния, который объединяет две точки, которые находятся ближе всего друг к другу, и усредняет их положение. После объединения двух точек с индексами i и j мне нужно заменить одну из них, скажем i, на среднее значение этих двух точек. Затем скопируйте последнюю точку в массиве поверх другой точки, скажем j, после чего я могу уменьшить размер массива на 1, при этом все оставшиеся точки будут в новом уменьшенном диапазоне. Мне нужно повторять вышеуказанный шаг, пока не останется только 3 репрезентативных точки, каждая из которых представляет собой группу объединенных точек. Я написал следующий код, но, думаю, он не может обновить массив (pts). Буду признателен, если кто-нибудь поможет мне разобраться в ошибке. Заранее спасибо. Это мой код: -
void merge_point(Point pts[], int &size) {
double a;
int x, y;
Point d;
while(size != 3) {
double min = get_distance(pts[0],pts[1]);
for (int i = 0; i < size; i++) {
for (int j = i+1; j < size; j++) {
get_distance(pts[i], pts[j]);
if ((a = get_distance(pts[i],pts[j])) <= min) {
x = i;
y = j;
}
a = get_distance(pts[i],pts[j]);
}
}
d = mean_point(pts[x],pts[y]);
pts[x] = d;
pts[y] = pts[size-1];
size = size - 1;
}
}
Когда я ввожу входной массив как: -
3 8 2
5,7 7,2 2,2
10,83 6,48 2,42
20,577 5,832 2,662
39,0963 5,2488 2,9282
74,283 4,72392 3,22102
141,138 4,25153 3,54312
268,162 3,82638 3,89743
509,507 3,44374 4,28718
968,063 3,09936 4,7159
Мои ожидаемые результаты должны быть: -
181,974 4,29686 3,57395
968,063 3,09936 4,7159
509,507 3,44374 4,28718
Но я получаю следующее: -
4,35 7,6 2,1
968,063 3,09936 4,7159
36,6506 5,8958 2,68145
1 ответ
Думаю, я обнаружил проблему, вы не обновляете минимальное расстояние, как только найдете новое во время цикла, попробуйте следующее:
cout << "distance between p[" << i << "] and " << "p[" << j << "]" << "is " << get_distance(pts[i], pts[j]) << '\n';
if ((a = get_distance(pts[i], pts[j])) <= min)
{
cout << "current min distance is between point[" << i << "]" << " and point[" << j << "]" << '\n';
min = a;
x = i;
y = j;
}
Вам нужно добавить эту инструкцию:
min = a;
Чтобы обновить мин. В противном случае это будет работать только для некоторых крайних случаев.
Похожие вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .