Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.98/40: Рейтинг темы: голосов - 40, средняя оценка - 4.98
42 / 42 / 5
Регистрация: 25.03.2014
Сообщений: 444

Указать (n-1)-звенную несамопересекающуюся замкнутую ломаную, проходящую через заданные точки

04.11.2014, 17:09. Показов 8830. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дано n точек на плоскости. Указать (n-1)-звенную несамопересекающуюся замкнутую ломаную, проходящую через все эти точки. (Соседним отрезкам ломаной разрешается лежать на одной прямой.) Подсказка. Возьмем самую левую точку (т.е. точку с наименьшей x-координатой) и проведем из нее лучи во все остальные точки. Теперь упорядочим эти лучи снизу вверх, а точки на одном луче упорядочим по расстоянию от начала луча (это делается для всех лучей, кроме нижнего и верхнего). Ломаная выходит из выбранной (самой левой) точки по нижнему лучу, затем по всем остальным лучам (в описанном порядке) и возвращается по верхнему лучу.
Подскажите как вообще это делать ??? Что должно включать в себя программа и код?
1
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.11.2014, 17:09
Ответы с готовыми решениями:

За время n logn построить (n-1)звенную не пресекающую себя ломаную проходящую через все точки
Дано n точек на плоскости заданных своими декартовыми координатами. За время n logn построить (n-1)звенную не пресекающую себя ломаную...

Указать (n-1)-звенную несамопересекающуюся замкнутую ломаную, проходящую через все заданные точки
Дано n точек на плоскости. Указать (n-1)-звенную несамопересекающуюся замкнутую ломаную, проходящую через все эти точки. (Соседним отрезкам...

Постройте ломаную линию, проходящую через заданные точки
На плоскости заданы n точек своими координатами. Постройте ломаную линию, проходящую через эти точки, причем через каждую точку ломаная...

26
 Аватар для D_in_practice
343 / 343 / 331
Регистрация: 02.10.2014
Сообщений: 666
04.11.2014, 21:05

Код на С++
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
#include <iostream>
#include <cmath>
 
using namespace std;
 
struct Point{
    double x;
    double y;
};
 
int main(){
    
    const int N = 20;
    int n;
    do{
        cout << "n = ";
        cin >> n;
    }while (n < 3 || n > N);
    
    Point a[N];
    for (int i = 0; i < n; ++i){
        cout << "Point " << i + 1 << ": ";
        cin >> a[i].x >> a[i].y;
    }
        
    const double EPS = 1e-10;
    
    //1. Ñîðòèðóþ ìàññèâ ïî x ïîòîì ïî y. (íåîáÿçàòåëüíî, ïðîñòî êîä êîðî÷å).
    for (int i = n - 1; i >= 0; --i)
        for (int j = 0; j < i; ++j)
            if ((a[j].x > a[j + 1].x) || 
                (fabs(a[j].x - a[j + 1].x) < EPS && a[j].y > a[j + 1].y)){
                Point temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
            }
    
    //2. Íàéäåì ïåðâóþ òî÷êó, êîîðäèíàòà x êîòîðîé îòëè÷íà îò íà÷àëüíîé òî÷êè.         
    int first = 0;
    while(fabs(a[0].x - a[++first].x) < EPS);
    
    //3. Îòñîðòèðóåì òî÷êè íà÷èíàÿ ñ first ïî óáûâàíèþ êîýôèöèåíòà íàêëîíà
    //ïðÿìîé ïðîâåäåííîé äî êàæäîé òî÷êè, èç òî÷êè ïåðåä first
    //ÿ îòñîðòèðóþ ïî âîçðàñòàíèþ -êîýôôèöèåíò
    //ïðè ðàâíûõ êîýýôèöèåíòàõ áóäåì ñðàâíèâàòü êîîðä x
    Point begin = a[first - 1];
    for (int i = n - 1 - first; i >= 0; --i)
        for (int j = first; j < i; ++j){
            double k1 = (begin.y - a[j].y) / (begin.x - a[j].x);
            double k2 = (begin.y - a[j + 1].y) / (begin.x - a[j + 1].x);
            if ((-k1 > -k2) || (fabs(k1 - k2) < EPS && a[j].x > a[j + 1].x)){
                Point temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
            }
        }
 
    for (int i = 0; i < n; ++i)
        cout << "Point " << i + 1 << ": " << a[i].x << ' ' << a[i].y << endl;
}
1
 Аватар для D_in_practice
343 / 343 / 331
Регистрация: 02.10.2014
Сообщений: 666
04.11.2014, 21:29
Лучший ответ Сообщение было отмечено Dgaizer как решение

Решение

Код на С++ (изменил строку 47)
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
#include <iostream>
#include <cmath>
 
using namespace std;
 
struct Point{
    double x;
    double y;
};
 
int main(){
    
    const int N = 20;
    int n;
    do{
        cout << "n = ";
        cin >> n;
    }while (n < 3 || n > N);
    
    Point a[N];
    for (int i = 0; i < n; ++i){
        cout << "Point " << i + 1 << ": ";
        cin >> a[i].x >> a[i].y;
    }
        
    const double EPS = 1e-10;
    
    //1. Ñîðòèðóþ ìàññèâ ïî x ïîòîì ïî y. (íåîáÿçàòåëüíî, ïðîñòî êîä êîðî÷å).
    for (int i = n - 1; i >= 0; --i)
        for (int j = 0; j < i; ++j)
            if ((a[j].x > a[j + 1].x) || 
                (fabs(a[j].x - a[j + 1].x) < EPS && a[j].y > a[j + 1].y)){
                Point temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
            }
    
    //2. Íàéäåì ïåðâóþ òî÷êó, êîîðäèíàòà x êîòîðîé îòëè÷íà îò íà÷àëüíîé òî÷êè.         
    int first = 0;
    while(fabs(a[0].x - a[++first].x) < EPS);
    
    //3. Îòñîðòèðóåì òî÷êè íà÷èíàÿ ñ first ïî óáûâàíèþ êîýôèöèåíòà íàêëîíà
    //ïðÿìîé ïðîâåäåííîé äî êàæäîé òî÷êè, èç òî÷êè ïåðåä first
    //ÿ îòñîðòèðóþ ïî âîçðàñòàíèþ -êîýôôèöèåíò
    //ïðè ðàâíûõ êîýýôèöèåíòàõ áóäåì ñðàâíèâàòü êîîðä x
    Point begin = a[first - 1];
    for (int i = n - 1; i >= 0; --i)
        for (int j = first; j < i; ++j){
            double k1 = (begin.y - a[j].y) / (begin.x - a[j].x);
            double k2 = (begin.y - a[j + 1].y) / (begin.x - a[j + 1].x);
            if ((-k1 > -k2) || (fabs(k1 - k2) < EPS && a[j].x > a[j + 1].x)){
                Point temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
            }
        }
 
    for (int i = 0; i < n; ++i)
        cout << "Point " << i + 1 << ": " << a[i].x << ' ' << a[i].y << endl;
}
1
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
04.11.2014, 22:40
можно просто посортить точки как пары и это тоже будет ответом.
1
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
04.11.2014, 23:54
SlavaSSU, по вашему варианту не получится
Цитата Сообщение от Dgaizer Посмотреть сообщение
замкнутую
- последняя линия из последней точки в первую перечеркнет все решение в прямом и переносном смыслах.
1
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
05.11.2014, 00:08
_Ivana, не представляю как через n точек можно провести n - 1 отрезок, чтобы получилась замкнутая фигура. Да и в подсказке там ничего не замкнуто вроде.
1
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
05.11.2014, 00:22
Ну насчет n-1 там глупость написана конечно, но сам алгоритм приведен верный - в подсказке все будет замкнуто. Если строить по нему, получится как раз замкнутая самонепересекающаяся ломаная, n звенная.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13179 / 6815 / 1821
Регистрация: 18.10.2014
Сообщений: 17,244
05.11.2014, 01:11
Цитата Сообщение от _Ivana Посмотреть сообщение
Ну насчет n-1 там глупость написана конечно, но сам алгоритм приведен верный
Это зависит от того, что именно является глупостью - количество звеньев или подсказка.

Алгоритм в подсказке - с полярной сортировкой - верный, но ориентирован именно на построение замкнутой ломаной.

Если же задачи построить замкнутую ломаную не стоит, то достаточно просто соединить точки в лексикографическом порядке, и не надо городить никакой полярной сортировки.

Возможно, что задача принадлежит одному автору, а подсказка - другому. И этот последний писал свою подсказку по принципу "искать будем не там, где потеряли, а там, где светло".
1
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
05.11.2014, 01:24
Давайте посчитаем - за один вариант 2 аргумента - слово "замкнутую" в условии и подсказка алгоритма, а за второй один - n-1 звеньев. Я выбираю первый вариант, к тому же он интереснее, хоть и с подсказкой. Думаю, от ТС ожидают реализацию именно его, а n-1 воспримут как досадную опечатку.
1
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
05.11.2014, 01:49
Мутная задача какая-то. Ее автор явно не в ладах с математикой. Если соседним звеньям ломаной разрешается сливаться, то почему два таких звена вдруг начинают считаться за одно? Если она замкнутая, то в ней не n - 1, а 2n - 2 звеньев должно быть.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13179 / 6815 / 1821
Регистрация: 18.10.2014
Сообщений: 17,244
05.11.2014, 01:50
Цитата Сообщение от _Ivana Посмотреть сообщение
Я выбираю первый вариант,
Я думаю это верный выбор, раз уж в условии кроме подсказки еще и присутствует слово "замкнутую".
1
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
05.11.2014, 01:53
Цитата Сообщение от Mr.X Посмотреть сообщение
Если она замкнутая, то в ней не n - 1, а 2n - 2 звеньев должно быть.
Не согласен, хотя это не важно. И так уже перебор внимания на эту задачку, решенную в первом же ответе.
1
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
05.11.2014, 02:08
Цитата Сообщение от _Ivana Посмотреть сообщение
Не согласен
Не очень понимаю ваше несогласие. Если у нас две точки, например, то сколько звеньев в замкнутой обходящей их ломаной?
1
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
05.11.2014, 02:14
2, сколько и точек - и это справедливо для любого количества точек, если исключить вырожденные случаи более двух точек на одной прямой.
1
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
05.11.2014, 02:18
Цитата Сообщение от _Ivana Посмотреть сообщение
2
Ну да, т.е. 2n - 2.
Цитата Сообщение от _Ivana Посмотреть сообщение
сколько и точек - и это справедливо для любого количества точек
Да ладно!
1
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
05.11.2014, 02:26
Зуб даю Проверьте хоть на треугольнике.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13179 / 6815 / 1821
Регистрация: 18.10.2014
Сообщений: 17,244
05.11.2014, 02:39
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну да, т.е. 2n - 2.
Ну здрасьте!

Условие задачи требует формирования связного графа (без петель и кратных ребер) с ровно одним циклом.

При этом связный граф из n-1 ребер на n вершинах является деревом. Добавление двух различных ребер в дерево автоматически образует как минимум два цикла. Т.е. связный граф с n+1 ребер уже гарантированно содержит два цикла как минимум. А вы предлагаете аж 2n-2 ребер туда вклепать...
1
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
05.11.2014, 07:44
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Условие задачи требует формирования связного графа (без петель и кратных ребер) с ровно одним циклом.
Ну, это вы уже сами выдумали. Условие ничего такого не требует. В условии вообще о ломаной говорится, а не о графе. И ребра графа и звенья ломаной - это совершенно разные вещи.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13179 / 6815 / 1821
Регистрация: 18.10.2014
Сообщений: 17,244
05.11.2014, 09:52
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну, это вы уже сами выдумали. Условие ничего такого не требует...
Нет, не выдумали. Я не утверждаю эквивалентности задач, я лишь утверждаю одностороннюю связь: любая ломаная очевидным образом однозначно определяет граф на множестве точек. Соответственно, свойства данной ломаной не могут нарушать никакие соответствующие графовые соотношения.
1
42 / 42 / 5
Регистрация: 25.03.2014
Сообщений: 444
06.11.2014, 20:50  [ТС]
D_in_practice, скажите пожалуйста у вас самого код работает так у меня в строках 20 33 46 52 выдает одну и туже ошибку [C++ Error] Unit1.cpp(26): E2015 Ambiguity between 'Point' and '_fastcall Classes::Point(int,int)'
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.11.2014, 20:50
Помогаю со студенческими работами здесь

Указать (n - 1)звездную не самопересекающуюся незамкнутую ломаную, проходящую через все эти точки
Дано n точек на плоскости. Указать (n - 1)звездную не самопересекающуюся незамкнутую ломаную, проходящую через все эти точки. (Соединим...

Построить прямую проходящую через 2 заданные точки не используя line
построить прямую проходящую через 2 заданные точки не используя line

Дано n точек на плоскости, за время n*logn построить (n-1)-звенную ломаную
Дано n точек на плоскости, заданных своими декартовыми координатами. За время n*logn построить (n-1)-звенную не пересекающую себя ломаную,...

Найти проекцию точки М(1,1,1) на прямую проходящую через точки М1(2,5,-3) и М2 (3,-2,2).
Найти проекцию точки М(1,1,1) на прямую проходящую через точки М1(2,5,-3) и М2 (3,-2,2).

Добавление точек в замкнутую ломаную линию
Всем здравствуйте. Есть массив точек (изначально он может состоять только из 1 точки). Интересует как добавить точки в ЗАМКНУТУЮ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru