Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 21.12.2021
Сообщений: 10

Выбрать четыре разные точки, которые являются вершинами квадрата наибольшего периметра

22.03.2023, 12:00. Показов 2830. Ответов 37
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задание. Задано множество точек на плоскости. Выбрать из них четыре разные точки, которые являются вершинами квадрата наибольшего периметра.

Нужна программа на C++ (можно на python). Можно хотя бы подсказать, навести на мысль, дать идею решения. Помогите, пожалуйста, буду благодарен.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.03.2023, 12:00
Ответы с готовыми решениями:

Четыре точки являются вершинами четырехугольника, могут ли они быть вершинами квадрата?
четыре точки являются вершинами четырехугольника A (x1, y1), B (x2, y2), C (x3, y3), D (x4, y4) . Выяснить, могут ли они быть вершинами...

Из заданного на плоскости множества точек (n<10) выбрать такие четыре точки, которые являются вершинами ромба
Помогите с заданием, необходимо выполнить, но не понимаю язык программирования c++ Нужна программа написанная на c++ Задание: Из...

Даны целые числа. Выяснить, найдутся ли среди точек четыре таких, которые являются вершинами квадрата
Даны целые числа x1, y1, x2, y2, ...xn, yn.Выяснить, найдутся ли среди точек с координатами (x1;y1), (x2;y2),...(xn;yn) четыре таких,...

37
33 / 25 / 8
Регистрация: 18.12.2022
Сообщений: 83
27.03.2023, 17:12
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Royal_X Посмотреть сообщение
добавлю, что в С++ есть функция std::hypot, которая эффективно меряет евклидово расстояние
Буду знать. Я в основе код для других задачи пишу...
0
фрилансер
 Аватар для Алексей1153
6486 / 5713 / 1133
Регистрация: 11.10.2019
Сообщений: 15,232
27.03.2023, 17:12
DavLab, я бы действовал примерно так:

1) создаём список всех возможных отрезков (каждый отрезок - это две точки)
2) сортируем список отрезков по убыванию длины
3) перебираем с самого длинного отрезка и пытаемся на отрезке построить квадрат (один из двух возможных по бокам от отрезка)
4) если получилось где-то построить - profit
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
27.03.2023, 17:15
Цитата Сообщение от KSergey9 Посмотреть сообщение
Либо я точки не так нумерую ABCD,
Если ваши ABCD - это последовательный обход по периметру, то мои ABC - это ваши BAC или BCA или CBD или CDB или DCA или DAC или ADB или ABD.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
27.03.2023, 17:18
Цитата Сообщение от zayats80888 Посмотреть сообщение
то мои ABC - это ваши BAC или BCA или CBD или CDB или DCA или DAC или ADB или ABD.
Видимо да
Я там в том сообщении картинку приложил как я нумерую.
0
0 / 0 / 0
Регистрация: 21.12.2021
Сообщений: 10
27.03.2023, 23:36  [ТС]
Доброй ночи.
Цитата Сообщение от KSergey9 Посмотреть сообщение
Что газеты с людьми делают! Ужос
Дело в том, что я запрашивал решение данной задачи в телеграм-боте, он смог дать программу уж слишком сильно похожую на ту, что написал один из первых здесь ответивших мне.

Цитата Сообщение от KSergey9 Посмотреть сообщение
Подсказать можно всегда, это не жалко.
Словами описать это можно, вопрос в том, что есть две оси координат и каждая точка имеет свои координаты (x, y). И какие здесь нужно использовать инструменты? Массивы? Может, структуры?
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6274 / 2998 / 1051
Регистрация: 01.06.2021
Сообщений: 11,217
28.03.2023, 00:49
Цитата Сообщение от DavLab
вопрос в том, что есть две оси координат и каждая точка имеет свои координаты (x, y). И какие здесь нужно использовать инструменты? Массивы? Может, структуры?
DavLab, можешь создать структуру, но я, например, предпочитаю пользоваться готовой, когда нужно использовать пару элементов, а именно std::pair из <utility>.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
28.03.2023, 05:50
Цитата Сообщение от DavLab Посмотреть сообщение
вопрос в том, что есть две оси координат и каждая точка имеет свои координаты (x, y). И какие здесь нужно использовать инструменты? Массивы? Может, структуры?
Но почему-то ваш вопрос звучал совсем не так.
Вопрос звучал "помогите решить задачу" и всё её условие. Т.е. по вопросу становится очевидно, что вы вообще не знаете как её решать, даже на уровне алгоритма/формул.
Почему так сформулирован вопрос?
Задали бы конкретный "вот есть такой алгоритм, какими средствами вот этот момент описать" - это уже совсем другое дело.

Точек несколько - значит нужен массив (хотя по уму вектор, конечно, это ж про С++ раздел). Массив структур с двумя полями x и y.

Добавлено через 3 минуты
Цитата Сообщение от Royal_X Посмотреть сообщение
а именно std:air из <utility>.
Вот честное слово - запретил бы этот дурацкий pair.
Написать структуру с двумя полями с осмысленными названиями - плёвое дело. Даже оператор сравнения к ним добавить не сложно при надобности или еще что.
А с этими pair код в каком-нибудь месте обязательно выливается во что-нибудь такое:
first.first.second->first.second->second
И капец, и хрен разберёшь "кто на ком".
0
фрилансер
 Аватар для Алексей1153
6486 / 5713 / 1133
Регистрация: 11.10.2019
Сообщений: 15,232
28.03.2023, 08:21
KSergey9, Royal_X, я тоже предпочитаю структурку накидать, чем связываться с std::pair
0
Объявлятель переменных
 Аватар для SpBerkut
1225 / 411 / 321
Регистрация: 24.09.2011
Сообщений: 1,279
28.03.2023, 08:59
Я в своё время так квадраты определял:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// Структура, описывающая точку с вещественными координатами
struct point {
    double x;
    double y;    
};
 
// Функция, вычисляющая расстояние между точками A и B по теореме Пифагора
double getDist(const point &A, const point &B) {
    return hypot(A.x - B.x, A.y - B.y);
}
 
// Функция, определяющая, являются ли точки A, B, C и D вершинами квадрата
bool isSquare(const point &A, const point &B, const point &C, const point &D) {
    bool result = true;
    
    // Честно говоря, не уверен, что такой массив одобрят, но с динамикой лень морочиться
    // В массиве храним расстояния между всеми парами точек
    double P[6] = {getDist(A, B), getDist(A, C), getDist(A, D), getDist(B, C), getDist(B, D), getDist(C, D)};
    
    // Простейшая сортировка массива расстояний по возрастанию
    for (int i = 0; i < 5; i++) {
        for (int j = i+1; j < 6; j++) {
            if (P[i] > P[j]) {
                double temp = P[i];
                P[i] = P[j];
                P[j] = temp;
            }
        }
    }
    
    // Каждый элемент делим на значение первого элемента
    for (int i = 5; i >= 0; i--) {
        P[i] /= P[0];
    }
    
    // Первые четыре элемента должны равняться единице
    for (int i = 0; i < 4; i++) {
        result *= (fabs(P[i] - 1.0) < 1e-12);
    }
    
    // Два последние элемента должны равняться sqrt(2)
    for (int i = 4; i < 6; i++) {
        result *= (fabs(P[i] - sqrt(2)) < 1e-12);
    }
    
    return result;
}
Почитал тут тему и понял, что после сортировки можно сэкономить на делении и проверить на равенство между собой первые четыре элемента и последние два. Результат, вроде, не должен поменяться.
0
28.03.2023, 09:09

Не по теме:

Цитата Сообщение от SpBerkut Посмотреть сообщение
Почитал тут тему и понял, что после сортировки можно сэкономить на делении и проверить на равенство между собой первые четыре элемента и последние два.
Можно обойтись вообще без делений, сортировок и вычисления длин(кроме длины или квадрата длины диагонали, для стравнения периметров). Как я писал, можно написать функцию, которая будет определять, являются ли три вершины вершинами квадрата и, если так, возвращать координаты четвертой для поиска. Существенная экономия для брутфорса, имхо.

0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6274 / 2998 / 1051
Регистрация: 01.06.2021
Сообщений: 11,217
28.03.2023, 09:35
Алексей1153, KSergey9, согласен, в pair иногда названия first, second не очень уместны. Например, для точки названия x, y выглядят лучше. Но говорить, что пользовательские структуры всегда лучше - неправильно. Я видел структуры с такими тупыми названиями элементов, что понимаешь, что лучше писать first, second (ибо они и в Африке first, second), чем смотреть на этот говнокод. Да и map использует pair и там считаю, что все норм.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
28.03.2023, 09:41
Цитата Сообщение от zayats80888 Посмотреть сообщение
можно написать функцию, которая будет определять, являются ли три вершины вершинами квадрата и, если так, возвращать координаты четвертой для поиска
Хорошая идея в самом деле!

Добавлено через 1 минуту
Цитата Сообщение от Royal_X Посмотреть сообщение
Да и map использует pair
Вот вот, с этого все и начинается.
мапа мапы, в той тоже pair плюс работаем с результатом find - и получается то, что я написал выше. Т.е. хрен пойми
0
28.03.2023, 10:04

Не по теме:

KSergey9, я не уверен, что ты придумал бы более подходящие универсальные названия для pair. first, second - это компромиссные названия. Они не идеальны, но они лучше других названий, если говорить не о конкретном коде, а просто о том, чем можно было заменить first, second. Не нравятся эти названия - не используй pair.
Сейчас не о тебе говорю. Но не раз слышал, что С++ говно, STL говно, мол самому можно в разы круче реализовать ту или иную готовую штучку в С++. Ну ок, кто мешает этим мамкиным хацкерам.

0
28.03.2023, 10:11

Не по теме:

Royal_X, оставьте свои фантазии при себе. Названия в pair отличные и нигде иного я не говорил. Равно как и про STL.
Я лишь о том, что не надо применять pair вместо пользовательских структур, даже если требуется всего 2 поля и pair как бы под рукой.

0
фрилансер
 Аватар для Алексей1153
6486 / 5713 / 1133
Регистрация: 11.10.2019
Сообщений: 15,232
28.03.2023, 11:14
Цитата Сообщение от Royal_X Посмотреть сообщение
Но говорить, что пользовательские структуры всегда лучше - неправильно
если названия полей заданы не абы как, то своя структура - всегда лучше пары. Потому что физически они ничем не отличаются, только именами полей

Добавлено через 50 секунд
Цитата Сообщение от Royal_X Посмотреть сообщение
я не уверен, что ты придумал бы более подходящие универсальные названия для pair.
если бы std::tuple добавили в STL раньше пары, то это было бы её название
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6274 / 2998 / 1051
Регистрация: 01.06.2021
Сообщений: 11,217
28.03.2023, 11:47
Алексей1153, мне вот интересно, можно ли выровнить память pair, как вот это можно для структур?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <utility>
 
#pragma pack(push, 1)
struct pair2
{
    int first;
    char second;
};
#pragma pack(pop)
 
int main() 
{
    std::pair<int, char> p;
    pair2 p2;
    std::cout << sizeof(p) << '\n'; // 8 bytes
    std::cout << sizeof(p2); // 5 bytes
}
0
фрилансер
 Аватар для Алексей1153
6486 / 5713 / 1133
Регистрация: 11.10.2019
Сообщений: 15,232
28.03.2023, 12:09
Цитата Сообщение от Royal_X Посмотреть сообщение
можно ли выровнить память pair
Royal_X, думаю, что нет

но выравнивание требуется очень редко и специфично. Там не грех свою структуру сделать вообще
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
11.06.2024, 13:12
Ребят, ну что за четвертые степени?
Если есть две точки квадрата, другие две точки банально высчитываются, а затем ищутся.
Набросал на коленке квадрат:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <iostream>
#include <cmath>
#include <unordered_set>
#include <random>
#include <algorithm>
#include <iomanip>
#include <optional>
 
struct Point {
    float x;
    float y;
};
 
bool operator==(const Point &a, const Point &b) {
    return (std::abs(a.x - b.x) < std::numeric_limits<float>::epsilon()) &&
           (std::abs(a.y - b.y) < std::numeric_limits<float>::epsilon());
}
 
bool operator!=(const Point &a, const Point &b) {
    return !(a == b);
}
 
struct PointHash {
    static inline std::hash<float> HASH{};
 
    auto operator()(const Point &point) const {
        return HASH(point.x) ^ HASH(point.y);
    }
};
 
struct Square {
    Point a;
    Point b;
    Point c;
    Point d;
    float side;
};
 
std::ostream &operator<<(std::ostream &out, const Point &point) {
    return out << std::fixed << std::setprecision(2) << "[" << point.x << ", " << point.y << "]";
}
 
std::ostream &operator<<(std::ostream &out, const Square &square) {
    return out << square.a << ", " << square.b << ", " << square.c << ", " << square.d << ", side=" << square.side;
}
 
int main() {
    std::random_device rd;
    std::mt19937_64 re(rd());
    std::uniform_int_distribution<int> dis(0, 9);
 
    std::unordered_set<Point, PointHash> points;
    size_t size = 100;
    std::generate_n(std::inserter(points, points.begin()), size, [&dis, &re]() {
        return Point{(float)dis(re), (float)dis(re)};
    });
 
    Square maxSquare{};
    for (auto i = points.begin(), end = points.end(); i != end; ++i) {
        for (auto j = std::next(i); j != end; ++j) {
            if (i != j && *i != *j) {
                auto side = std::hypot(i->x - j->x, i->y - j->y);
                std::cout << *i << " - " << *j << ": " << side << std::endl;
 
                auto dx = i->x - j->x;
                auto dy = i->y - j->y;
 
                //смежные веришны первый вариант
                Point k1{i->x + dy, i->y - dx};
                Point l1{j->x + dy, j->y - dx};
                if (points.count(k1) > 0 && points.count(l1) > 0) {
                    if (side > maxSquare.side) {
                        maxSquare = {*i, *j, k1, l1, side};
                    }
                }
 
                //смежные веришны второй вариант
                Point k2{i->x - dy, i->y + dx};
                Point l2{j->x - dy, j->y + dx};
                if (points.count(k2) > 0 && points.count(l2) > 0) {
                    if (side > maxSquare.side) {
                        maxSquare = {*i, *j, k2, l2, side};
                    }
                }
 
                //диагональ
                dx = (i->x - j->x) / 2;
                dy = (i->y - j->y) / 2;
                Point k3{(i->x + j->x) / 2 - dy, (i->y + j->y) / 2 + dx};
                Point l3{(i->x + j->x) / 2 + dy, (i->y + j->y) / 2 - dx};
                if (points.count(k3) > 0 && points.count(l3) > 0) {
                    if (side > maxSquare.side) {
                        maxSquare = {*i, *j, k3, l3, side};
                    }
                }
            }
        }
    }
 
    std::cout << "Square: " << maxSquare;
 
    return 0;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.06.2024, 13:12
Помогаю со студенческими работами здесь

Выбрать 3 разные точки заданного на плоскости множества точек,составляющие треугольник наибольшего периметра
Подкиньте идею...

Выбрать три разные точки заданного на плоскости множества точек, составляющие треугольник наибольшего периметра
Задание, как множество точек вывести на экран понял. #include &lt;iostream&gt; #include &lt;time.h&gt; #define _CRT_SECURE_NO_DEPRECATE 0 using...

Выбрать из точек четыре разные, которые являются вершинами квадрата наибольшего периметра
Задано множество точек на плоскости. Выбрать из низ четыре разные точки, которые являются вершинами квадрата наибольшего периметра. (Т.А)

Выберите четыре разные точки, которые являются вершинами квадрата наибольшего периметра
Задание: Задано множество точек на плоскости. Выберите из них четыре разные точки, которые являются вершинами квадрата наибольшего...

Выбрать четыре точки, которые являются вершинами квадрата наибольшего периметра
Задано множество точек на плоскости. Выбрать из них четыре разных точки, которые являются вершинами квадрата наибольшего периметра. Кто...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
Новые блоги и статьи
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации: В классе Работник добавить: накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни коэффициентПрезентеизма — снижает продуктивность. . .
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день. Для работы необходим браузер,. . .
Модель здравосохранения 16. Слишком хорошие и здоровые сотрудники уходят, недовольные зарплатой
anaschu 23.05.2026
Отладка увольнений и настройка производительности Сегодня во второй половине дня разобрались с механикой увольнений и настроили коэффициент сложности заданий. Вот что было сделано. . . .
Как я стал коммунистом))) Модель сохранения здоровья сотрудников, запись блога номер 15
anaschu 23.05.2026
Внезапно хорошее здоровье сотрудников не нужно капиталистам?))
Модель здравоСохранения 15. Как мы чинили AnyLogic модель рабочего коллектива: сочленение диаграммы состояний болезней и поломок в ресурспул
anaschu 23.05.2026
Как мы чинили AnyLogic модель рабочего коллектива Сегодня разобрались с пятью багами, из-за которых модель либо падала с ошибкой, либо давала совершенно бессмысленные результаты. Каждый баг был. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru