Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 11.05.2020
Сообщений: 18
1

Найти координаты точки, которая отстоит от всех заданных точек на минимальном расстоянии

23.06.2020, 07:29. Просмотров 1796. Ответов 18
Метки нет (Все метки)


В плоском зале установлено множество точек доступа (больше 2). Необходимо найти координаты точки в зале, которая отстоит от всех точек на минимальном расстоянии.
Программа работает, но при вводе матрицы
000
000
111
программа выводит точку с координатами (0 : 0), не могу понять в чем ошибка.
Вот код:
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
int n,i,j,m,min=2147483647; int sum=0,x,y,prov=0,prov1=0;
    printf("Введите размерность: ");
  if(scanf("%d",&n)!=1)
    printf("Неверный ввод!");
  else
  {
    if (n < 1) 
    {
      printf("Размерность не может быть меньше 2х.");
    }
    else
    {
      int a[n][n];
      int XY[n*n][2];
      printf("Введите матрицу :" );
      printf("\n");
      for(i=1;i<=n;i++)
      {
        for (j=1; j<=n; j++)
        {
         
          scanf("%d", &a[i][j]);
          if(a[i][j]>1)
          {
            prov++;
          }
        }
 
      }
      
      for(i=1;i<=n;i++)
      {
        for(j=1;j<=n;j++)
        {
          if (a[i][j] == 1)
          {
            
            XY[i][1]=i;
            XY[i][0]=j;
            prov1++;
            
            
          }
        }
      }
      if (prov1 >= 2)
      {
        if(prov>1)
        {
          printf("Неверный ввод.");
        }
        else
        {
          for(i=1;i<=n;i++)
          {
            printf("\n");
            for (j=1; j<=n; j++)
            {
              printf("%d ", a[i][j]);
            }
          }
          for(i=1;i<=n-1;i++)
          {
            for(j=1;j<=2;j++)
            {
                if (XY[i][0] != j || XY[i][0] != i )
                {
                  
                  int sum1 = XY[i+1][0]-XY[i][0];
                  int sum2 = XY[i+1][1]-XY[i][1];
                  
                  sum = sqrt(pow(sum1,2) + pow(sum2,2));
                  
                  x = XY[i][0];
                  y = XY[i][1];
                  if (sum < min)
                  {
                    min = sum;
                    x = XY[i][0];
                    y = XY[i][1];
                  }
 
                }
            }
          }
          printf("Координата Х искомой точки: %d, Координата Y искомой точки: %d",x,y);
        }
      }
      else
      {
         printf("Точек должно быть больше 2х.");
      }
    }  
  }  return 0;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.06.2020, 07:29
Ответы с готовыми решениями:

Выяснить, какие из заданных точек находятся на минимальном расстоянии друг от друга и найти это расстояние
Четыре точки заданы своими координатами Х (х1,х2,х3), Y (y1,y2,y3), Z(z1,z2,z3), T (t1,t2,t3)....

Выяснить, какие из точек находятся на минимальном расстоянии друг от друга и найти значение этого расстояния
Четыре точки заданы своими координатами X(x1, x2, x3), Y(y1, y2, y3), Z(z1, z2, z3), T(t1,t2, t3)....

Найти координаты точки пересечения и расстояния от нее до заданных точек
Задание: Заданы две пересекающиеся прямые, с помощью 4 точек. Найти координаты точки пересечения и...

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

18
1068 / 979 / 145
Регистрация: 19.02.2010
Сообщений: 3,016
23.06.2020, 10:09 2
Цитата Сообщение от kobanina Посмотреть сообщение
не могу понять в чем ошибка.
В ДНК том, что при расчёте используется целочисленный тип данных. Он ничего дробного не может просто по-определению.
1
0 / 0 / 0
Регистрация: 11.05.2020
Сообщений: 18
23.06.2020, 11:06  [ТС] 3
Дело не в этом. С другими типами все равно имеется ошибка.
0
С чаем беда...
Эксперт CЭксперт С++
8522 / 4241 / 1172
Регистрация: 18.10.2014
Сообщений: 9,194
23.06.2020, 11:39 4
Что означает формулировка "точка отстоит от всех точек на минимальном расстоянии"?
0
0 / 0 / 0
Регистрация: 11.05.2020
Сообщений: 18
23.06.2020, 11:42  [ТС] 5
Я думаю, что нужно найти расстояние от каждой точки до всех других, суммировать это и сравнить с суммой других точек.
0
Модератор
Эксперт CЭксперт С++
4303 / 3869 / 710
Регистрация: 07.10.2015
Сообщений: 7,943
23.06.2020, 11:44 6
kobanina, кто Вас учил считать индексы массива с единицы? В Си, как и в С++, счет идет с нуля.
0
0 / 0 / 0
Регистрация: 11.05.2020
Сообщений: 18
23.06.2020, 11:59  [ТС] 7
Это сделано для того, чтобы счет столбцов и строк начинался с 1ц, т.е. столбцы и строки в данном случае это X и Y, а если бы счет был с нуля, координаты были бы 0. Или я как-то неверно мыслю?
0
С чаем беда...
Эксперт CЭксперт С++
8522 / 4241 / 1172
Регистрация: 18.10.2014
Сообщений: 9,194
23.06.2020, 12:02 8
Цитата Сообщение от kobanina Посмотреть сообщение
Я думаю, что нужно найти расстояние от каждой точки до всех других, суммировать это и сравнить с суммой других точек.
Я не вижу, где в условии задачи сказано, что точку нужно искать среди уже имеющихся точек. Почему вы выбираете одну из уже данных точек?

Ваша формулировка косноязычна, но звучит как классическая задача на поиск геометрического центра. То есть вам нужно построить совершенно новую точку, а не выбрать одну из существующих. Тогда ваше нынешнее решение - это совсем не в ту степь.
0
Модератор
Эксперт CЭксперт С++
4303 / 3869 / 710
Регистрация: 07.10.2015
Сообщений: 7,943
23.06.2020, 12:07 9
Лучший ответ Сообщение было отмечено kobanina как решение

Решение

Цитата Сообщение от kobanina Посмотреть сообщение
чтобы счет столбцов и строк начинался с 1ц
Кто мешает для X и Y добавлять единичку.
А так получилось, что массив имеет размерность [n], и обращаясь по индексу n, выходим за пределы массива.
Есть еще вариант задать размерность [n+1], [(n+1)*(n*1)] соответственно. Но, мне кажется, проще просто добавлять единичку в нужном месте.
1
0 / 0 / 0
Регистрация: 11.05.2020
Сообщений: 18
23.06.2020, 12:10  [ТС] 10
Я ввожу в матрицу точки в количестве больше 2х. И среди введенных точек нужно найти координаты той, у которой сумма расстояний наименьшая.
0
С чаем беда...
Эксперт CЭксперт С++
8522 / 4241 / 1172
Регистрация: 18.10.2014
Сообщений: 9,194
23.06.2020, 12:13 11
Цитата Сообщение от kobanina Посмотреть сообщение
Я ввожу в матрицу точки в количестве больше 2х. И среди введенных точек нужно найти координаты той, у которой сумма расстояний наименьшая.
Ах вот оно что... Тогда прямой и очевидный вопрос: почему только к сообщению #10 вы удосужились сформулировать более-менее осмысленное условие задачи? Почему ничего этого нет в сообщении #1?
1
Модератор
Эксперт CЭксперт С++
4303 / 3869 / 710
Регистрация: 07.10.2015
Сообщений: 7,943
23.06.2020, 12:25 12
Цитата Сообщение от kobanina Посмотреть сообщение
у которой сумма расстояний наименьшая
расстояний от чего до чего?

Добавлено через 2 минуты
В программе вводится массив a, а используется частично иницированный массив XY. Это как?

Добавлено через 1 минуту
Потому и выводится начальное значение глобальных переменных x и y, равное нулю. Т.к. ничего не делается.
0
0 / 0 / 0
Регистрация: 11.05.2020
Сообщений: 18
23.06.2020, 12:35  [ТС] 13
Расстояний от одной точки до других.
Массив XY - это столбцы и строки точек в массиве a (точки, это элементы массива, равные 1).
0 0 0
0 0 0
1 1 1 В этой вводимой матрице три элемента, равные 1, значит в матрице XY должны быть координаты этих точек( столбец и строка), переменным x и y присваиваются значения в матрице XY, которые не равны нулю, вроде как.
0
Модератор
Эксперт CЭксперт С++
4303 / 3869 / 710
Регистрация: 07.10.2015
Сообщений: 7,943
23.06.2020, 12:39 14
Цитата Сообщение от kobanina Посмотреть сообщение
Расстояний от одной точки до других
Еще раз, только расстояние между точками, заданными единицами?

Добавлено через 2 минуты
Нули игнорируем?
0
0 / 0 / 0
Регистрация: 11.05.2020
Сообщений: 18
23.06.2020, 12:40  [ТС] 15
Да. Мы берем одну точку, ищем расстояние до ВСЕХ ДРУГИХ и суммируем. Потом берем вторую точку, также ищем расстояние до всех других и суммируем и так пока точки не закончатся. После мы сравниваем эти суммы и выводим координаты той точки, у которой эта сумма наименьшая.

Добавлено через 34 секунды
Точки заданы единицами, нули - игнорируем.
0
Модератор
Эксперт CЭксперт С++
4303 / 3869 / 710
Регистрация: 07.10.2015
Сообщений: 7,943
23.06.2020, 13:09 16
Лучший ответ Сообщение было отмечено kobanina как решение

Решение

kobanina, вот теперь стало понятно
Сейчас нарисую

Добавлено через 28 минут
kobanina, вот:
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
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<locale.h>
 
typedef struct _point
{
    int x;
    int y;
}point;
 
int main()
{
    const int n = 3;
    int i, j, prov, m, imin;
    double min, sum;
    bool first;
 
    int a[n][n];
    point XY[n*n];
 
    setlocale(LC_ALL, "Rus");
 
    printf("Введите матрицу :");
    printf("\n");
 
    for (prov = i = 0; i < n; ++i)
    {
        for (j = 0; j < n; ++j)
        {
            scanf("%d", &a[i][j]);
            prov += (a[i][j] > 1);  //считаем ошибочные значения
        }
    }
 
    for (m = i = 0; i < n; ++i)
    {
        for (j = 0; j < n; ++j)
        {
            if (a[i][j] == 1)
            {
                XY[m].y = i;
                XY[m++].x = j;  //одновременно считаем точки
            }
        }
    }
    if (m >= 2) //количество точек
    {
        if (prov > 0)
            printf("Неверный ввод.\n");
        else
        {
            for (i = 0; i < n; ++i)
            {
                for (j = 0; j < n; j++)
                    printf("%d ", a[i][j]);
                printf("\n");
            }
 
            first = true;
            for (i = 0; i < m - 1; ++i)
            {
                sum = 0;
                for (j = i + 1; j < m; ++j)
                    sum += sqrt((XY[i].y - XY[j].y)*(XY[i].y - XY[j].y) + (XY[i].x - XY[j].x)*(XY[i].x - XY[j].x));
 
                if (first || (sum < min))
                {
                    min = sum;
                    imin = i;
                }
                first = false;
            }
        }
        printf("Координата Х искомой точки: %d, Координата Y искомой точки: %d\n", XY[imin].x+1, XY[imin].y+1);
    }
    else
    {
        printf("Точек должно быть больше 2х.\n");
    }
    return 0;
}
Немного переделал Сравните...
Не стал заморачиваться с вводом размерности. Задал строго 3
Ввел структуру для наглядности
1
0 / 0 / 0
Регистрация: 11.05.2020
Сообщений: 18
23.06.2020, 14:06  [ТС] 17
Цитата Сообщение от liv Посмотреть сообщение
if (a[i][j] == 1)
{
XY[m].y = i;
XY[m++].x = j; //одновременно считаем точки
}
А что значит .y и .x? Я не знаю что это, не могли бы вы объянить?
Цитата Сообщение от liv Посмотреть сообщение
sum += sqrt((XY[i].y - XY[j].y)*(XY[i].y - XY[j].y) + (XY[i].x - XY[j].x)*(XY[i].x - XY[j].x));
И тут тоже.
И спасибо вам огромное.
0
Модератор
Эксперт CЭксперт С++
4303 / 3869 / 710
Регистрация: 07.10.2015
Сообщений: 7,943
23.06.2020, 14:14 18
kobanina, знаете, что такое структуры?
Посмотрите в начале кода. XY теперь - массив структур с полями x и y

Добавлено через 2 минуты
Если не знаете, найдите описание. По-любому пригодится в дальнейшем
0
0 / 0 / 0
Регистрация: 11.05.2020
Сообщений: 18
23.06.2020, 14:14  [ТС] 19
Что такое структуры знаю, но как использовать на языке Си не особо, спасибо, разберусь.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.06.2020, 14:14

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

Выяснить, какие из точек находятся на минимальном расстоянии друг от друга
Четыре точки заданы своими координатами X(x1,x2,x3),Y(y1,y2,y3),Z(z1,z2,x3),T(t1,t2,t3) Выяснить,...

Выяснить, какая из точек находится на минимальном расстоянии от начала координат
На плоскости заданы координаты трех точек А, В, С. Выяснить, какая из точек находится на...

Выяснить, какие 4-х точек, заданых своими координатами, находятся на минимальном расстоянии друг от друга
Буду благодарен, если поможете решить вот эту задачку: Четыре точки заданы своими координатами...

Ввести координаты точек. Вычислить расстояния от всех точек до точки, введенной последней
С клавиатуры вводятся координаты точек на плоскости в виде строк, представляющих пару в формате...

Найти координаты точек, находящихся на максимальном расстоянии
program record5;{найти координаты точек, находящихся на максимальном расстоянии}; type Coord...

Найти координаты точки на отрезке при известном расстоянии до неё
Есть отрезок с известными координатами начала и конца, допустим А(х1, у1) и B(x2, y2). Как найти...


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

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

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