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

Даны целые числа. Выяснить, найдутся ли среди точек четыре таких, которые являются вершинами квадрата - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Создание объекта класса указателем http://www.cyberforum.ru/cpp-beginners/thread182111.html
Не подскажите как создать указатель на новый объект класса с помощью указателя(пожалуйста со всеми объявлениями и тп) Дублирование тем запрещено правилами форума (п. 3.4). Не плодите одинаковых тем.
C++ Дни рождения Написать программу, пердупреждающую о днях рождениях друзей, желательно с подсказками Дублирование тем запрещено правилами форума (п. 3.4). Не плодите одинаковых тем. http://www.cyberforum.ru/cpp-beginners/thread182100.html
C++ WinAPI Выполнение скрипта php через WinAPI
Доброго всем времени суток! Необходимо выполнить удаленный php-скрипт, типа http://mysite.ru/script.php с помощью функций winapi. Скрипт не возвращает данные, они не нужны. Как это осуществить? З.Ы. Думал с помощью InternetOpenUrl, но не пойму до конца как...
C++ swap
Cи подчеркивает swap и говорит что он не определен! в данном случаи а это массив, а i и j индексы элементов swap(a,i,j)
C++ Фигура из квадратов http://www.cyberforum.ru/cpp-beginners/thread182087.html
Даны действительные числа а1,в1,с1,а2,в2,с2,...аn, вn,cn. Эта последовательность определяет на плоскости n квадратов со сторонами, параллельными осям: аi, вi- координаты центра квадрата, сi-длина его стороны (i=1,...n).Определить площадь фигуры, образованной всеми квадратами. Помогите пожалуйста, буду очень благодарен.....
C++ Массив ( ввод массива пользователем ) Нужен такой код , чтоб пользователь сам вводил элементы массива ! Добавлено через 2 минуты Можно только тело программы .. подробнее

Показать сообщение отдельно
Mr.X
Эксперт С++
 Аватар для Mr.X
2807 / 1583 / 248
Регистрация: 03.05.2010
Сообщений: 3,691
30.10.2010, 14:16     Даны целые числа. Выяснить, найдутся ли среди точек четыре таких, которые являются вершинами квадрата
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
//////////////////////////////////////////////////////////////////////////////////////
//Даны целые числа x1, y1, x2, y2, ...xn, yn.Выяснить, найдутся ли среди точек 
//с координатами (x1;y1), (x2;y2),...(xn;yn) четыре таких, которые являются 
//вершинами квадрата.Определить подпрограммы вычисления расстояния между 2-мя точками, 
//определения взаимного расположения прямых и другие, необходимые для решения.
//////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <iterator>
#include <set>
//////////////////////////////////////////////////////////////////////////////////////
struct  T_int_point
{
    int X_;
    int Y_;
    //--------------------------------------------------------------------------------
    T_int_point(int X, int Y) : X_(X), Y_(Y)
    {}
    //--------------------------------------------------------------------------------
    T_int_point  operator+(T_int_point  p) const
    {
        int  X_res = X_ + p.X_;
        int  Y_res = Y_ + p.Y_;
        return  T_int_point(X_res, Y_res);
    }
    //--------------------------------------------------------------------------------
    T_int_point  operator-(T_int_point  p) const
    {
        int  X_res = X_ - p.X_;
        int  Y_res = Y_ - p.Y_;
        return  T_int_point(X_res, Y_res);
    }
    //--------------------------------------------------------------------------------
    void  print() const
    {
        std::cout << "("
                  << X_
                  << ", "
                  << Y_
                  << ")";
    }
    //--------------------------------------------------------------------------------
    bool  operator< (T_int_point  p) const
    {
        return  X_ == p.X_ ? Y_ < p.Y_ : X_ < p.X_;
    }
};
//////////////////////////////////////////////////////////////////////////////////////
typedef  std::set<T_int_point>   T_int_points;
typedef  std::set<T_int_points>  T_squares;
//////////////////////////////////////////////////////////////////////////////////////
T_int_point  vect(const T_int_point  A, const T_int_point  B)
{
    return  B - A;
}
//////////////////////////////////////////////////////////////////////////////////////
int dist_a_square(const T_int_point  A, const T_int_point  B)
{
    T_int_point  vect_AB = vect(A, B);
    return  vect_AB.X_ * vect_AB.X_ + vect_AB.Y_ * vect_AB.Y_;
}
//////////////////////////////////////////////////////////////////////////////////////
void  print_points_forming_squares(const T_int_points&  int_points)
{ 
    T_squares  squares;
    //Перебираем все сочетания по две точки в поисках гипотенузы 
    //прямоугольного треугольника:
    for(T_int_points::const_iterator  A_hip_it = int_points.begin(); 
        A_hip_it != int_points.end(); ++A_hip_it)
    {
        for(T_int_points::const_iterator  B_hip_it = A_hip_it; 
            B_hip_it != int_points.end(); ++B_hip_it)
        {
            if(B_hip_it == A_hip_it)
            {
                continue;
            }
            //Перебираем все точки множества в поисках вершины
            //для предполагаемой гипотенузы прямоугольного треугольника.
            for(T_int_points::const_iterator  C_it = int_points.begin();  
                C_it != int_points.end(); ++C_it)
            {
                if(    C_it == A_hip_it
                    || C_it == B_hip_it)
                {
                    continue;
                }
                //Проверяем, образуют ли точки равнобедренный 
                //прямоугольный треугольник с гипотенузой AB.
                int AB_hip_len2 = dist_a_square(*A_hip_it, *B_hip_it);
                int AC_cat_len2 = dist_a_square(*A_hip_it, *C_it);
                int BC_cat_len2 = dist_a_square(*B_hip_it, *C_it);
 
                if(AC_cat_len2 == BC_cat_len2
                   && AB_hip_len2 == AC_cat_len2 + BC_cat_len2)
                {
                    T_int_point  D = *C_it + vect(*C_it, *B_hip_it) + vect(*C_it, *A_hip_it);                    
                    //Если точка, дополняющая прямоугольный 
                    //треугольник до квадрата существует:
                    if(int_points.find(D) != int_points.end())
                    {
                        T_int_points  square;
                        square.insert(*A_hip_it);                        
                        square.insert(*B_hip_it);
                        square.insert(*C_it);
                        square.insert(D);
 
                        squares.insert(square);
                    }
                }
            }
        }
    }
 
    std::cout << (squares.empty() 
                      ? "Нет вершин квадратов."
                      : "В данном множестве точек являются вершинами квадратов:")
              << std::endl;
 
    //Печатаем все квадраты из squares:   
    for(T_squares::iterator  square_it = squares.begin(); 
        square_it != squares.end(); ++square_it)
    {
        std::cout << "квадрат № "                  
                  << std::distance(squares.begin(), square_it) + 1
                  << "\t\t";
        for(T_int_points::const_iterator  vertice_it = square_it->begin(); 
            vertice_it != square_it->end(); ++vertice_it)
        {
            
            vertice_it->print();
            std::cout << "    ";
        }
        std::cout << std::endl
                  << std::endl
                  << std::endl;
    }    
}
//////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    const int  POINTS_IN_SQUARE = 4;
    int  n;
    do
    {
        std::cout << "Введите количество точек >= "
                  << POINTS_IN_SQUARE
                  << ": ";
        std::cin >> n;
    }while(n < POINTS_IN_SQUARE);
    
    std::cout << "Введите целые координаты "
              << n
              << " различных точек: "
              << std::endl;
 
    T_int_points  int_points;
    do
    {
        std::cout << "X" 
                  << int_points.size() + 1 
                  << " = ";
        int x = 0;
        std::cin >> x;
 
        std::cout << "Y"
                  << int_points.size() + 1 
                  << " = ";
        int y = 0;
        std::cin >> y;
        std::cout << std::endl;
        int_points.insert(T_int_point(x, y));
    }while(static_cast<int>(int_points.size()) < n);
 
    print_points_forming_squares(int_points);
}
 
Текущее время: 19:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru