Форум программистов, компьютерный форум CyberForum.ru

удаление повторяющихся точек - C++

Восстановить пароль Регистрация
 
Kirill Losev
3 / 3 / 0
Регистрация: 01.10.2011
Сообщений: 249
18.12.2011, 16:10     удаление повторяющихся точек #1
в общем, делаю курсовик, вот его задание:

"Даны N точек на плоскости. Для всех треугольников, образуемых любыми тремя точками, определить, является ли треугольник прямоугольным"

все работает и компилится, но надо удалить повторяющиеся точки.
ввод данных происходит из файла, где все элементы расположены в виде двумерного массива следующим образом:

0 0
1 8
1 0
2 8
0 2
2 2
0 0
1 0
1 1
0 0

вот, допустим, надо удалить повторяющиеся точки (0,0), чтобы повторных треугольников не было, да и чтобы при создании программой этих треугольников, не возникало их такого вида: (0,0)(1,8)(0,0)

вроде как понятен мой вопрос. всем заранее спасибо
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Виктор_Сен
 Аватар для Виктор_Сен
30 / 23 / 1
Регистрация: 01.08.2011
Сообщений: 176
18.12.2011, 16:38     удаление повторяющихся точек #2
Алгорим может быть примерно такой:
1. Сопоставить с каждой точкой флаг, который определяет, повторяющаяся точка или нет.
2. Установить все флаги в false
3. Цикл по этому массиву с первой по предпоследнюю точку
4. Внутри #3 цикла цикл по этому-же массиву начиная от следующей точки после текущей точки цикла #3 до последней точки массива
5. Если текущая точка цикла #3 совпадает с текущей точкой цикла #4, то пометить точку цикла #4 как повторяющуюся.
6. После завершения цикла #3 все повторяющиеся точки известны.
Алгоритм конечно можно оптимизировать, например в цикле #3 проверять точку, если она уже повторяющаяся, то сравнивать с ней нет смысла. В таком случае пропускать итерацию цикла #3.
Kirill Losev
3 / 3 / 0
Регистрация: 01.10.2011
Сообщений: 249
18.12.2011, 17:21  [ТС]     удаление повторяющихся точек #3
Виктор_Сен, спасибо.буду осмыслять
интересно узнать есть ли способ попроще?
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
18.12.2011, 17:22     удаление повторяющихся точек #4
Отсортировать, не?
Kirill Losev
3 / 3 / 0
Регистрация: 01.10.2011
Сообщений: 249
18.12.2011, 17:24  [ТС]     удаление повторяющихся точек #5
можно спросить по-другому:
как удалить повторяющиеся стоки двумерного массива?

Добавлено через 28 секунд
soon, хорошая идея
спасибо
Петррр
 Аватар для Петррр
5917 / 3354 / 333
Регистрация: 28.10.2010
Сообщений: 5,926
18.12.2011, 18:06     удаление повторяющихся точек #6
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
// Считывание точек из файла и удаление повторяющихся
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <iterator>
 
using namespace std;
 
struct point{
    double x, y;
    bool operator == (const point &right) {
        return this->x == right.x && this->y == right.y ? true : false;
    }
    bool operator != (const point &right) {
        return ! (*this == right);
    }
    friend ostream& operator << (ostream &out, const point &p) {
        out << "(" << p.x << ", " << p.y << ")";
        return out;
    }
    bool operator < (const point &right) const {
        if (this->x < right.x)
            return true;
        else
            if (this->x > right.x)
                return false;
        if (this->y < right.y)
            return true;
        return false;
    }
    bool operator > (const point &right) const{
        if (this->x > right.x)
            return true;
        else
            if (this->x < right.x)
                return false;
        if (this->y > right.y)
            return true;
        return false;
    }
};
 
int main() {
    vector<point> vec;
    ifstream points("D:\\points.txt");
    while (!points.eof()){
        point p;
        points >> p.x;
        points >> p.y;
        vec.push_back(p);
    }
    points.close();
    cout << "All points: " << endl;
    copy(vec.begin(), vec.end(), ostream_iterator<point>(cout, "\n"));
    cout << "+----------------------+" << endl;
    sort(vec.begin(), vec.end());
    vector<point>::iterator it = unique(vec.begin(), vec.end());
    vec.erase(it, vec.end());
    cout << "Unique points: " << endl;
    copy(vec.begin(), vec.end(), ostream_iterator<point>(cout, "\n"));
    return EXIT_SUCCESS;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.12.2011, 18:21     удаление повторяющихся точек
Еще ссылки по теме:

C++ Удаление повторяющихся символов
Удаление из вектора повторяющихся элементов C++
Удаление повторяющихся чисел C++

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

Или воспользуйтесь поиском по форуму:
Kirill Losev
3 / 3 / 0
Регистрация: 01.10.2011
Сообщений: 249
18.12.2011, 18:21  [ТС]     удаление повторяющихся точек #7
Петррр, спасибо, конечно, большое, но боюсь, что мне не осилить такой большой объем новой информации. очень много в вашем коде того, чего я еще не изучал.
но, тем не менее, буду разбираться, спасибо
Yandex
Объявления
18.12.2011, 18:21     удаление повторяющихся точек
Ответ Создать тему
Опции темы

Текущее время: 15:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru