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

Выбрать 3 точки множества, составляющих треугольник наибольшего периметра - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Трехмерном пространстве http://www.cyberforum.ru/cpp-beginners/thread72933.html
В множестве А1 в трехмерном пространстве найти пару точек с максимальным расстоянием между ними(использовать структуру)
C++ Си++ Создать шаблон Triangle (элементы - стороны треугольника). Определить конструктор и функцию вывода значения сторон. Написать программу, где определяются объект со сторонами типа int и объект со сторонами типа float и печатаются соответствующие значения. Помогите решить пожалуйста http://www.cyberforum.ru/cpp-beginners/thread72926.html
VS08 как выделять мой класс цветом? C++
если я в vs08 в текст.редакторе ввожу к примеру INT то слово выделяется синим цветом,а есть ли там такая функция что и мой класс\функция выделялась?
маленькая прожка с ошибкой C++
компиляция проходит успешно, после запуска выдает ошибку (см вложение) прога открывает файл, посимвольно его читает. если символ есть в массиве al, в st счетчик увеличивается, если нет - добавляет символ и тож увеличивает счетчик. FILE *big; char s, al; int t, j, n, st; big=fopen("big.txt","r"); for(int i=0;i<55;i++) st=0; j=0; n=0; while(!feof(big)) { ...
C++ Определить является ли последовательность почти периодической http://www.cyberforum.ru/cpp-beginners/thread72898.html
Последовательность целых чисел называется почти периодической, если среди сумм всех последовательно расположенных троек чисел имеется не более двух различных. Например, последовательность 2_8_0_7_3_5_2_8_5 является почти периодической, так как все тройки чисел 2_8_0, 8_0_7, 0_7_3, 7_3_5, 3_5_2, 5_2_8, 2_8_5 в сумме дают 10 или 15. Дана последовательность целых чисел. Определить является ли...
C++ Функция strtok_s Можно ли как-нибудь изменить функцию strtok_s что бы она не только разбивала строку на слова, но и еще выводила тот разделитель по которому разделяются слова? Например строка: Слово, слово "слово" слово? Нужно вывести вот так: Слово , слово " слово " слово подробнее

Показать сообщение отдельно
Vladimir.
155 / 155 / 10
Регистрация: 24.11.2009
Сообщений: 375
11.12.2009, 13:27     Выбрать 3 точки множества, составляющих треугольник наибольшего периметра
Что-то не хотят Вам отвечать.
решено полным перебором
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
/*
Выбрать 3 различные точки заданного на плоскости множества точек,
составляющих треугольник наибольшего периметра.
 
Пусть вершины A(xA; yA; zA), B(xB; yB; zB), C(xC; yC; zC). 
Тогда периметр треугольника найдется как сумма длин сторон ВА, BC, CA:
P = |ВА| + |BC| + |CA| =корень((xA – xB)^2 + (yA – yB)^2 + (zA – zB)^2) +
+ корень( (xC – xB)^2  + (yC – yB)^2  + (zC – zB)^2 ) + 
+ корень( (xA – xC)^2  + (yA – yC)^2  + (zA – zC)^2 );
Пусть множество заданно необходимым и достаточным образом, 
то есть любой элемент множества встречаеться в описании один 
и только один раз, а так же существует правило по которому мы можем
перебрать все элементы множества не повторяясь.
Тогда, решение можно найти полным перебором всех возможных
комбинаций A, B, C 
В частности, если множество задано массивом элементами которого являются
координаты:
(ужжос как пафосно... всё намного проще =) )
*/
 
#include<math.h>
//только для использования sqrt;
 
#include<iostream>
using namespace std;
 
double d(double *p1, double *p2)// возвращает расстояние между точками p1 p2
{
    double dx2,dy2,dz2; //dx2 = (Xa - Xb)^2
    dx2 = (p1[0]-p2[0])*(p1[0]-p2[0]);
    dy2 = (p1[1]-p2[1])*(p1[1]-p2[1]);
    dz2 = (p1[2]-p2[2])*(p1[2]-p2[2]);
    return sqrt(dx2+dy2+dz2);
}
 
int main()
{
    //инициализация массива случайной размерности:
    srand( time(NULL) );
    int dimm = rand()%100+3;//размерность не меньше трёх.
    cout<<"\ndimm = "<<dimm<<endl;
    double** m = new double* [dimm];
    for (int i = 0;i<dimm;i++) m[i] = new double [3];
    
    //Заполним его случайными координатами в диапазоне от -1 до 1:
    for (int i = 0;i<dimm;i++)
    {
        m[i][0] = double(rand()%200 - 100)/100; //x from -1 to +1;
        m[i][1] = double(rand()%200 - 100)/100; //y from -1 to +1;
        m[i][2] = double(rand()%200 - 100)/100; //z from -1 to +1;          
    }
    // ниже идёт описание вспомогательных переменных:
    //p = perimetr ab,bc,ca = distance; a,b,c = points;
    double p = 0;
    double ab,bc,ca; ab = bc = ca = 0;
    int a,b,c; a = b = c = 0;
    
    // Все приготовления завершены, можно приступить к поиску решения:
    for(int ia=0;ia<dimm;ia++)
    {
        for(int ib=0;ib<dimm;ib++)
        {
            for(int ic=0;ic<dimm;ic++)
            {
                ab = d(m[ia],m[ib]);
                bc = d(m[ib],m[ic]);
                ca = d(m[ic],m[ia]);
                if(ab+bc+ca > p) // если верно, то найден новый максимальный периметр
                {
                    p = ab+bc+ca;
                    cout<<"new max p = "<<p<<endl;//можно закомментировать строку.
                    a = ia;
                    b = ib;
                    c = ic;
                }
            }
        }
    }
    // Решение найдено, осталось только вывести его куда-нибудь.
    
    cout<<"\n\nmax P = "<<p<<endl;
    cout<<"\t"<<"\tx"<<"\t\ty"<<"\t\tz"<<endl;
    cout<<" points A\t"<<m[a][0]<<"\t\t"<<m[a][1]<<"\t\t"<<m[a][2]<<"\t\t"<<endl;
    cout<<" points B\t"<<m[b][0]<<"\t\t"<<m[b][1]<<"\t\t"<<m[b][2]<<"\t\t"<<endl;
    cout<<" points C\t"<<m[c][0]<<"\t\t"<<m[c][1]<<"\t\t"<<m[c][2]<<"\t\t"<<endl;       
            
 
    system("pause");
        //Освобождение памяти:
    for (int i = 0;i<dimm;i++) delete m[i];
    delete m;            
    return 0;
}
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru