Найти ближайшую точку из массива

Я пытаюсь создать таблицу, используя массив, например, такую ​​таблицу

int array[5][3] = { {A, 200, 400}, {B, 300, 600}, {C, 100, 200}, {D, 200, 100}, {E, 200, 400} };

поэтому вывод массива будет таким:

| id |  X  |  Y  |
| A  | 200 | 400 | //First Row
| B  | 300 | 600 | //Second Row
| C  | 100 | 200 |
| D  | 300 | 100 |
| E  | 200 | 400 |

в этом примере у меня есть значение:

int valueid = null; int valueX = 150; int valueY = 170;

поэтому в этом случае ближайшей точкой из таблицы является идентификатор C из таблицы для моего значения.

мой вопрос: как найти ближайшую точку туалета из таблицы массива

Я знаю, что sqrt можно найти только для одной строки:

int cx = array[0][1] - valueX;
int cy = array[0][2] - valueY;
int FindClosest = sqrt(cx * cx + cy * cy);

как подсчитать ближайшую точку из таблицы массива в приведенном выше коде, вычислить только ближайшую точку из первой строки, как рассчитать из всей строки и распечатать результат?

Напишите цикл для прохождения всех строк ваших таблиц. Используйте переменную, чтобы отслеживать ближайшие найденные значения. При необходимости обновите эту переменную на каждой итерации цикла. Когда цикл завершится, переменная будет содержать ближайшее расстояние. Это довольно простые вещи, и они будут объяснены в любой книге по программированию для начинающих. Если вы хотите научиться программировать, вам следует купить хорошую книгу.

john 04.09.2024 07:13

Не зная вашего точного задания или упражнения (о котором вы действительно должны нам сообщить), я бы сказал, что A, B и т. д. — это просто метки и не должны быть в массивах. Кроме того, пожалуйста, найдите время, чтобы прочитать справочный центр , пройти экскурсию по SO и прочитать Как задать вопрос . Также, пожалуйста, прочитайте о как написать «идеальный» вопрос , особенно о его контрольном списке . Затем отредактируйте свой вопрос, чтобы улучшить его.

Some programmer dude 04.09.2024 07:17

@john Никаких необработанных циклов;) (Шон Пэрент).

Pepijn Kramer 04.09.2024 07:33

Я бы сказал, что ваш вопрос «слишком начинающий». Очевидный первоначальный подход — просто перебирать элементы, и как это сделать, объясняется в начале любой приличной книги по C++ (кстати, у нас есть их список). Несмотря на то, что Пепейн Крамер уже дал вам очень хороший ответ, без основ C++ вы его не поймете.

pptaszni 04.09.2024 07:56

@Someprogrammerdude, сэр, легко понять, как печатать ближайшее значение из моего x y, сохранять int, сравнивать с x y в каждой строке

ocat dota2 04.09.2024 08:03
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В стандартной библиотеке есть раздел алгоритмов со всеми видами функций для часто используемых алгоритмов, которые проверены и пригодны для повторного использования. Для вашей проблемы это будет std::min_element. Чтобы min_element работал читабельным образом, моделируйте свои точки как Point (класс/структуру), а не как какой-то многомерный целочисленный массив (в котором индексы используются для представления x и y и идентификатора). После того, как вы смоделировали точку, вы можете создать из них массив (или вектор). Следующий шаг — заставить std::min_element работать, предоставив функцию сравнения: которая обычно предоставляется в виде лямбда-выражения.

Демо :https://onlinegdb.com/itNV7M3nG

#include <vector>
#include <cmath>
#include <string>
#include <algorithm>
#include <iostream>

// Do NOT use `int array[5][3]` thats a semantically meaningless thing
// only showing HOW you are implementing things, but missing the point
// of describing what you are doing. That will make code hard to read

// So lets introduce a struct to represent a point in your array
// and a function to calculate distance between two of your points

struct Point
{
    std::string name;
    int x;
    int y;

    double distance(const Point& other) const
    {
        return std::sqrt((x - other.x) * (x - other.x) + (y - other.y) * (y - other.y));
    }
};

// https://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt
// print Point to output stream
std::ostream& operator<<(std::ostream& os, const Point& point)
{
    os << "`" << point.name << "(" << point.x << "," << point.y << ")`";
    return os;
}

int main()
{
    // resizable array (std::vector)    
    std::vector<Point> points{ { "A", 0, 0 }, { "B", 2, 2 }, { "C", 5, 5 }, { "D", 9, 9 } };

    // The point you want to find the closest point to
    Point somePoint{ "X", 3, 3 };

    // https://en.cppreference.com/w/cpp/algorithm/min_element
    // https://en.cppreference.com/w/cpp/language/lambda
    auto it = std::min_element(points.begin(), points.end(), 
        // Lambda expression : Capture `somePoint` by reference and then make a compare function that compares distance to `somePoint`for two points in the input
        [&](const Point& a,const Point& b) 
        { 
            return a.distance(somePoint) < b.distance(somePoint); 
        });

    // it is now an iterator referencing the closest point to `somePoint`
    std::cout << "Closest point to " << somePoint << " is " << *it << "\n";
}

Отказ от ответственности: это немного грубый подход. Он пересчитает расстояния (это можно было увидеть и раньше), я больше сосредоточился на демонстрации кодирования в стиле C++.

std::sqrt() медленно и ненужно.
3CxEZiVlQ 04.09.2024 07:51

@3CxEZiVlQ вы правы. Это поиск минимума (метод SquaredDistance следует добавить в Point и использовать в comarisson). Но, как уже было сказано, это немного грубый подход ;)

Pepijn Kramer 04.09.2024 07:52

это хорошо, но у меня есть вопрос: как, если A, B, C, D являются целыми примерами 1, 2, 3, 4, поэтому я хочу, чтобы результат int i = значение, близкое к точке; пример вашего кода: C является ближайшим, но как, если C — это число int, и я хочу заполнить i = Near(C); или, может быть, это может быть int i = std::min_element(point.begin()); если я хочу получить ценность

ocat dota2 04.09.2024 08:07

Просто замените имя std::string на int index;, а затем вы можете использовать int index = *std::min_element... для прямого разыменования возвращенного итератора.

Pepijn Kramer 04.09.2024 08:34

@PepijnKramer нет необходимости в отдельном индексе, просто используйте it - points.begin()

Alan Birtles 04.09.2024 08:53

@PepijnKramer, я пытаюсь вести себя так, но получаю ошибку int i = min_element(points.begin()); не могли бы вы дать мне пример кода, извините, я новичок в использовании c++

ocat dota2 04.09.2024 10:28

ах, ок, я понимаю, извини, я нуб

ocat dota2 04.09.2024 12:01

Не уговаривайте себя так, вы тот, кто хочет учиться :) Все отзывы выше в коде: onlinegdb.com/dP4ywofao

Pepijn Kramer 04.09.2024 12:12

Другие вопросы по теме