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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ILNARA
0 / 0 / 0
Регистрация: 10.12.2009
Сообщений: 24
#1

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

10.12.2009, 20:51. Просмотров 459. Ответов 1
Метки нет (Все метки)

Выбрать 3 различные точки заданного на плоскости множества точек,составляющих треугольник наибольшего периметра.Помогите пож-та написать программку,очень нужнозаранее большое спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.12.2009, 20:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Выбрать 3 точки множества, составляющих треугольник наибольшего периметра (C++):

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

Выбрать три разные точки заданного на плоскости множества точек, составляющие треугольник наибольшего периметра - C++
Задание, как множество точек вывести на экран понял. #include <iostream> #include <time.h> #define _CRT_SECURE_NO_DEPRECATE 0 using...

Из заданного на плоскости множества точек выбрать такие три, которые составляют треугольник наибольшего периметра. - C++
Помогите ребят!!!!препод задачи задачи для аттестации,сделал фактически все,кроме этой: "Из заданного на плоскости множества точек...

Треугольник наибольшего периметра - C++
Друзья, никак не могу осилить задачку, заранее благодарю!) Найти три различные точки из заданного множества точек, образующих...

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

Задача на структуры: выбор точек, образующих треугольник наибольшего периметра - C++
Найти три различные точки из заданного множества точек, образующих треугольник наибольшего периметра. Множество точек задано на...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Vladimir.
155 / 155 / 10
Регистрация: 24.11.2009
Сообщений: 375
11.12.2009, 13:27 #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
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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.12.2009, 13:27
Привет! Вот еще темы с ответами:

Выбрать четыре различные точки первого множества по правилу - C++
Пытаюсь написать программу но не доходит как это сделать: Даны два множества точек на плоскости. Выбрать четыре различные точки первого...

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

Из заданного множества точек на плоскости выбрать две различные точки - C++
Из заданного множества точек на плоскости выбрать две различные точки так, что бы количества точек, лежащих по разные стороны прямой,...

Из заданного на плоскости множества точек выбрать три различные точки - C++
Здравствуйте, помогите пожалуйста написать программу: Из заданного на плоскости множества точек выбрать три различные точки так, чтобы...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru