Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
14 / 17 / 11
Регистрация: 20.10.2018
Сообщений: 98
1

Выпуклая оболочка

24.01.2019, 21:35. Показов 2700. Ответов 1

Здравствуйте!

Столкнулся с проблемой: не выходит правильно написать выпуклую оболочку

Ввод: количество точек (n), далее n координат (x, y) в декартовой системе координат
Вывод: количество точек на выпуклой оболочке и их координаты в декартовой системе координат

Вот код:
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
#include <bits/stdc++.h>
 
using namespace std;
 
struct point
{
    long long x, y;
};
 
point operator-(const point& a, const point& b)
{
    return {a.x-b.x, a.y-b.y};
}
 
bool operator<(const point& a, const point& b)
{
    return a.x < b.x || a.x == b.x && a.y < b.y;
}
 
long long operator^(const point& a, const point& b)
{
    return a.x*b.y - a.y*b.x;
}
 
int rotation(const point& a, const point& b, const point& c)
{
    long long cross = (b-a)^(c-b);
    if (cross < 0)
        return -1;
    if (cross > 0)
        return 1;
    return 0;
}
 
void convex_hull(vector<point>& points)
{
    sort(points.begin(), points.end());
    int n = points.size();
    vector<point> top = {points[0]}, bottom = {points[0]};
    for (int i = 1; i < n; i ++)
    {
        if (rotation(points[0], points[n-1], points[i]) >= 0)
        {
            while (top.size() > 1 && rotation(top[top.size()-2], top[top.size()-1], points[i]) >= 0)
                top.pop_back();
            top.push_back(points[i]);
        }
        else
        {
            while (bottom.size() > 1 && rotation(bottom[bottom.size()-2], bottom[bottom.size()-1], points[i]) <= 0)
                bottom.pop_back();
            bottom.push_back(points[i]);
        }
    }
    reverse(bottom.begin(), bottom.end());
    bottom.pop_back();
    cout << top.size() + bottom.size() << "\n";
 
 
    for(int i = 0; i < top.size() ; i ++)
    {
        cout << top[i].x << " " << top[i].y << "\n";
    }
    for(int i = 0; i < bottom.size() ; i ++)
    {
        cout << bottom[i].x << " " << bottom[i].y << "\n";
    }
 
}
 
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n, x, y;
    cin >> n;
    vector < point > points;
    for (int i = 0 ; i < n; i ++)
    {
        cin >> x >> y;
        points.push_back({x, y});
    }
    convex_hull(points);
}
Помогите пожалуйста, срочно

Заранее спасибо!
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.01.2019, 21:35
Ответы с готовыми решениями:

Задача "Выпуклая оболочка" (acmp)
Вот мой код, при проверке в системе WA на 6-ом тесте. Алгоритм - найти крайние точки и построить...

Графическая оболочка
А чтобы писать программы с графической оболочкой на С++ скоко надо учиться? и как это сложно?

графическая оболочка
Возник вопрос с таким заданием: 1)Нужно создать абстрактный класс &quot;геометрические фигуры&quot; сделать...

Графическая оболочка
Здравствуйте) у меня возникла проблемка, у меня есть скомпелированная игра &quot;Змейка&quot;, но проблема в...

1
14 / 17 / 11
Регистрация: 20.10.2018
Сообщений: 98
29.01.2019, 17:34  [ТС] 2
Тема закрыта

Если кому-то надо то вот код (правильный)
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
struct point
{
    long long x, y;
};
 
point operator-(const point& a, const point& b)
{
    return {a.x-b.x, a.y-b.y};
}
 
bool operator<(const point& a, const point& b)
{
    return a.x < b.x || a.x == b.x && a.y < b.y;
}
 
long long operator^(const point& a, const point& b)
{
    return a.x*b.y - a.y*b.x;
}
 
int rotation(const point& a, const point& b, const point& c)
{
    long long cross = (b-a)^(c-b);
    if (cross < 0) return -1;
    if (cross > 0) return 1;
    return 0;
}
 
vector < point > convex_hull(vector<point>& points)
{
    sort(points.begin(), points.end());
    int n = points.size();
    vector<point> top = {points[0]}, bottom = {points[0]};
    for (int i = 1; i < n; i ++)
    {
        if (rotation(points[0], points[n-1], points[i]) >= 0)
        {
            while (top.size() > 1 && rotation(top[top.size()-2], top[top.size()-1], points[i]) >= 0)
                top.pop_back();
            top.push_back(points[i]);
        }
        else
        {
            while (bottom.size() > 1 && rotation(bottom[bottom.size()-2], bottom[bottom.size()-1], points[i]) <= 0)
                bottom.pop_back();
            bottom.push_back(points[i]);
        }
 
    }
 
    while (bottom.size() > 1 && rotation(bottom[bottom.size()-2], bottom[bottom.size()-1], points[n-1]) <= 0)
        bottom.pop_back();
 
    reverse(bottom.begin(), bottom.end());
 
    for (point u:bottom)
        top.push_back(u);
    top.pop_back();
    return top;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.01.2019, 17:34

Файловая оболочка
Уважаемые товарищи,прошу помочь мне реализовать такой проект на языке C: Файловая оболочка....

Графическая оболочка на С++
Привет всем, учил С++ , но так просто для проведения досуга , теперь решил писать программы,...

Оболочка программы
Всем доброго времени суток. Мне по семестровой надо написать небольшую программу с оболочкой. Под...

Оболочка для программы
Вот пишу программу на с++ и интересует, как создать графическую оболочку для программы? Надо...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru