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

Задан массив точек. Найти номера наиболее и наименее удаленных друг от друга точек. - C++

Восстановить пароль Регистрация
 
Leonman
 Аватар для Leonman
15 / 15 / 0
Регистрация: 17.06.2012
Сообщений: 266
16.08.2012, 14:25     Задан массив точек. Найти номера наиболее и наименее удаленных друг от друга точек. #1
Условие задачи: В одномерном массиве с четным количеством элементов (2N) находятся координаты N точек плоскости. Они располагаются в следующем порядке: x1, у1, х2, у2, x3, y3 и т.д. Найти номера наиболее и наименее удаленных друг от друга точек.

Мой код:

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
#include <iostream>
#include <iomanip>
#include <vector>
#include <cmath>
using namespace std;
 
int main()
{ 
   int n;
   float a[n];
   cout << "Введите количество точек:" << endl;
   cin >> n;
    cout << "Введите координаты точек:" << endl;
   for (int i = 0; i < n*2; i++)
    cin >> a[i];
   system("CLS");
   vector<float> b;
   vector<int> d;
   vector<int> e;
   vector<int> dotmin1;
   vector<int> dotmax1;
   vector<int> dotmin2;
   vector<int> dotmax2;
   for (int i = 0; i < n; i++)
    cout << "X: " << a[2*i] << " " << setw(7) << "Y: " << a[2*i+1] << endl; 
   for (int i = 0; i < n; i++)  
    for (int j = i+1; j < n; j++)  
    { 
     b.push_back(sqrt((a[2*j] - a[2*i]) * (a[2*j] - a[2*i]) + (a[2*j+1] - a[2*i+1]) * (a[2*j+1] - a[2*i+1]))); 
     d.push_back(i+1);
     e.push_back(j+1);
    }
   for (int i = 0; i < b.size(); i++)
    cout << b[i] << " ";
    cout << endl;
   for (int i = 0; i < d.size(); i++)
    cout << d[i] << " ";
    cout << endl;
   for (int i = 0; i < e.size(); i++)
    cout << e[i] << " ";
    cout << endl;
   float min = b[0]; 
   for (int i = 0; i < b.size(); i++)
    if (min >= b[i])
    { 
     min = b[i]; 
     dotmin1.push_back(d[i]);
     dotmin2.push_back(e[i]);
    }
    cout << "MIN: " << min << endl;
   for (int i = 0; i < dotmin1.size(); i++)
     cout << dotmin1[i] << " и " << dotmin2[i] << endl;   
   float max = b[0]; 
   for (int i = 0; i < b.size(); i++)
    if (max <= b[i])
    {
     max = b[i];  
     dotmax1.push_back(d[i]);
     dotmax2.push_back(e[i]);
    }
    cout << "MAX: " << max << endl;  
   for (int i = 0; i < dotmax1.size(); i++) 
     cout << dotmax1[i] << " и " << dotmax2[i] << endl;
   
system("PAUSE >> null");    
}
Для тестирования используйте точки: -2,1; 1,2; 0,0; 4,-3;
Точки записывать в командную строку так, как они написаны здесь.
Правильный ответ: для минимального расстояния точки 1 и 3; 2 и 3
Правильный ответ: для максимального расстояния точки 1 и 4

У меня на выходе:
для минимального расстояния точки 1 и 2; 1 и 3; 2 и 3
для максимального расстояния точки 1 и 2; 1 и 4

Откуда берутся точки 1 и 2 в обоих случаях?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.08.2012, 14:25     Задан массив точек. Найти номера наиболее и наименее удаленных друг от друга точек.
Посмотрите здесь:

Разработать программу для нахождения пары самых удаленных друг от друга точек C++
найти две наиболее удаленных друг от друга точки (множество точек задано на плоскости) C++
C++ Найти номера наиболее и наименее удаленных друг от друга точек
C++ Динамическая матрица (Найти координаты двух точек, наиболее удалённых друг от друга)
C++ Найти наиболее и наименее удаленные точки. Вычисление расстояния между парой точек оформить функцией
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Intel~lect
 Аватар для Intel~lect
135 / 124 / 2
Регистрация: 03.07.2012
Сообщений: 355
16.08.2012, 14:43     Задан массив точек. Найти номера наиболее и наименее удаленных друг от друга точек. #2
Цитата Сообщение от Leonman Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
float min = b[0]; 
 for (int i = 0; i < b.size(); i++)
 if (min >= b[i])  // При i = 0 условие всегда истинно. Потому что в этом случае min равно b[0]
 { 
 min = b[i]; 
 dotmin1.push_back(d[i]);
 dotmin2.push_back(e[i]);
 }
То же самое и при нахождении максимального
-=ЮрА=-
Заблокирован
Автор FAQ
16.08.2012, 15:35     Задан массив точек. Найти номера наиболее и наименее удаленных друг от друга точек. #3
Leonman, вот так думаю будет норм
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
#include <cmath>
#include <vector>
#include <string>
#include <utility>
#include <sstream>
#include <iostream>
using namespace std;
 
string data = "5.4 12.3 0 -5 14 16.9 23 11 -8 25.1"; 
double getLen(
                pair<double, double> pBeg, 
                pair<double, double> pEnd
             );
 
int main()
{
    double x, y;
    vector<pair<double, double> > vec;
    vector<pair<double, double> >::iterator i;
    vector<pair<double, double> >::iterator j;
     
    stringstream ss(data);
    while(!ss.eof())
    {
        if(ss>>x>>y)
            vec.push_back(make_pair(x,y));
    }
 
    vector<pair<double, double> >::iterator imin;imin = vec.begin();
    vector<pair<double, double> >::iterator jmin;jmin = vec.end() - 1;
    vector<pair<double, double> >::iterator imax;imax = vec.begin();
    vector<pair<double, double> >::iterator jmax;jmax = vec.end() - 1;
    for(i = vec.begin(); i < vec.end(); i++)
    for(j = vec.begin(); j < vec.end(); j++)
    {
        if(i != j)
        {
            //Èùåì ìèГ*ГЁГ¬Г*ëüГ*Г® ГіГ¤Г*ë¸Г*Г*ûå òî÷êè
            if(getLen(*i, *j) < getLen(*imin, *jmin))
            {
                imin = i;
                jmin = j;
            }
            //Èùåì Г¬Г*ГЄГ±ГЁГ¬Г*ëüГ*Г® ГіГ¤Г*ë¸Г*Г*ûå òî÷êè
            if(getLen(*imax, *jmax) < getLen(*i, *j))
            {
                imax = i;
                jmax = j;
            }
        }
    }
    cout<<"\tPAIR OF POINTS:\n";
    cout<<"with min Length : "
        <<"("<<(*imin).first<<";"<<(*imin).second<<")"
        <<" - "
        <<"("<<(*jmin).first<<";"<<(*jmin).second<<")"
        <<"\nminLength : "
        <<getLen(*imin, *jmin)<<endl;
    cout<<"with max Length : "
        <<"("<<(*imax).first<<";"<<(*imax).second<<")"
        <<" - "
        <<"("<<(*jmax).first<<";"<<(*jmax).second<<")"
        <<"\nmaxLength :  "
        <<getLen(*imax, *jmax)<<endl;
    return 0;
}
 
double getLen(
                pair<double, double> pBeg, 
                pair<double, double> pEnd
             )
{
    return sqrt
        (
            pow(pEnd.first - pBeg.first,2.0) 
            + 
            pow(pEnd.second - pBeg.second,2.0)
        );
}
Проверка : http://codepad.org/dnc0fPT9
Миниатюры
Задан массив точек. Найти номера наиболее и наименее удаленных друг от друга точек.  
Leonman
 Аватар для Leonman
15 / 15 / 0
Регистрация: 17.06.2012
Сообщений: 266
16.08.2012, 21:39  [ТС]     Задан массив точек. Найти номера наиболее и наименее удаленных друг от друга точек. #4
Intel~lect, Вы бы не могли написать, как модно исправить эту проблему?

Добавлено через 48 секунд
-=ЮрА=-, Спасибо за код, но мне всё-таки важно понять, как надо исправить мой.
Intel~lect
16.08.2012, 22:22
  #5

Не по теме:

Leonman, Извините, но у меня сейчас голова вообще не работает. Я вот ошибку нашел, а как ее исправить не могу понять.

Leonman
 Аватар для Leonman
15 / 15 / 0
Регистрация: 17.06.2012
Сообщений: 266
16.08.2012, 23:20  [ТС]     Задан массив точек. Найти номера наиболее и наименее удаленных друг от друга точек. #6
Intel~lect, Вот и я уже не один час мучаюсь, но всё равно спасибо.
Yandex
Объявления
16.08.2012, 23:20     Задан массив точек. Найти номера наиболее и наименее удаленных друг от друга точек.
Ответ Создать тему
Опции темы

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