Среди заданного множества точек на плоскости выбрать 3 по условию - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Среди заданного множества точек на плоскости выбрать 3 такие, чтобы треугольник, вершинами которого эти точки являются, содержал бы наибольшее количество точек множества.

Решение задачи: «Среди заданного множества точек на плоскости выбрать 3 по условию»

textual
Листинг программы
#include <stdio.h>
#include <conio.h>
 
#define NMAX 100
 
void main()
{
  double eps = 1e-3;
  int i,n, r1 = 0, r2 = 0, r3 = 0;
  int t,t1,t2,t3;
  float x[NMAX], y[NMAX];
  int maxcount = 0;
  printf("Vvedite kolvo tochek: ");
  scanf("%d", &n);
  for (i = 0; i < n; i++)
  {
    printf("x[%d] = ", i);
    scanf("%f", &x[i]);
    printf("y[%d] = ", i);
    scanf("%f", &y[i]);
  }
 
  for (t1 = 0; t1 < n; t1++)
     for (t2 = 0; t2 < n; t2++)
         for (t3 = 0; t3 < n; t3++)
        {
          int count = 0;
          for (t = 0; t < n; t++)
             {
               if ((t != t1) && (t != t2) && (t != t3) && (t1 != t2) && (t1 != t3) && (t2 != t3))
                 {
                   float v = (x[t]-x[t1])*(y[t2]-y[t1])-(y[t]-y[t1])*(x[t2]-x[t1]);
                   if ((((x[t]-x[t2])*(y[t3]-y[t2])-(y[t]-y[t2])*(x[t3]-x[t2]))*v>-eps) &&
                     (((x[t]-x[t3])*(y[t1]-y[t3])-(y[t]-y[t3])*(x[t1]-x[t3]))*v>-eps))
                     count++;
                }
       }
       if (count > maxcount) 
       {
          maxcount = count;
          r1 = t1;
          r2 = t2;
          r3 = t3;
       }
   }
    printf("Treugolnik s vershinami %d, %d, %d. kolvo tochek vnutri %d", r1, r2, r3, maxcount);
    getch();
}

Объяснение кода листинга программы

Код решает задачу поиска треугольника с максимальным количеством вершин, удовлетворяющих условию, среди заданного множества точек на плоскости. Список действий:

  1. Подключение необходимых библиотек.
  2. Объявление переменных:
    • double eps = 1e-3; - задание точности вычислений.
    • int i,n; - служебные переменные для циклов.
    • int r1 = 0, r2 = 0, r3 = 0; - переменные для хранения координат вершин треугольника.
    • int t,t1,t2,t3; - служебные переменные для циклов.
    • float x[NMAX], y[NMAX]; - массивы для хранения координат точек.
    • int maxcount = 0; - переменная для хранения количества вершин треугольника.
    • printf(Vvedite kolvo tochek: ); - вывод запроса на ввод количества точек.
    • scanf(%d, &n); - считывание количества точек.
    • for (i = 0; i < n; i++) - цикл для ввода координат точек.
    • printf(x[%d] = , i); - вывод запроса на ввод координаты по оси x.
    • scanf(%f, &x[i]); - считывание координаты по оси x.
    • printf(y[%d] = , i); - вывод запроса на ввод координаты по оси y.
    • scanf(%f, &y[i]); - считывание координаты по оси y.
  3. Поиск треугольника:
    • for (t1 = 0; t1 < n; t1++) - внешний цикл по точкам.
    • for (t2 = 0; t2 < n; t2++) - второй вложенный цикл по точкам.
    • for (t3 = 0; t3 < n; t3++) - третий вложенный цикл по точкам.
    • int count = 0; - переменная для подсчета вершин треугольника.
    • float v = (x[t]-x[t1])*(y[t2]-y[t1])-(y[t]-y[t1])*(x[t2]-x[t1]); - вычисление коэффициента треугольника.
    • `if ((((x[t]-x[t2])(y[t3]-y[t2])-(y[t]-y[t2])(x[t3]-x[t2]))*v>-eps) &&
    • ((x[t]-x[t3])(y[t1]-y[t3])-(y[t]-y[t3])(x[t1]-x[t3]))*v>-eps))` - условие принадлежности точки к треугольнику.
    • count++; - увеличение счетчика вершин.
    • if (count > maxcount) - проверка, является ли текущий треугольник максимальным.
    • maxcount = count; - обновление максимального количества вершин.
    • r1 = t1; - сохранение координат вершин треугольника.
    • r2 = t2;
    • r3 = t3;
  4. Вывод результата:
    • printf(Treugolnik s vershinami %d, %d, %d. kolvo tochek vnutri %d, r1, r2, r3, maxcount); - вывод результата.
    • getch(); - ожидание нажатия клавиши для завершения программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.4 из 5
Похожие ответы