Найдите пару треугольников, максимально удаленных друг от друга - Lisp

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

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

Помогите пожалуйста. Надо написать функцию с использованием рекурсии. Пусть дано множество треугольников, заданных координатами своих вершин. Найдите пару треугольников, максимально удаленных друг от друга.

Решение задачи: «Найдите пару треугольников, максимально удаленных друг от друга»

textual
Листинг программы
;; центр треугольника
 
(defun center (x1 y1 x2 y2 x3 y3)
  (list (/ (+ x1 x2 x3) 3.0) (/ (+ y1 y2 y3) 3.0))) 
 
;; Расстояние между центрами треугольников
 
(defun dist (p1 p2)
  (let ((n1 (car p1))
        (n2 (car p2))
        (x1 (cadr p1))
        (x2 (cadr p2))
        (y1 (caddr p1))
        (y2 (caddr p2)))
  (list (list n1 n2) (+ (^ (- x1 x2) 2) (^ (- y1 y2) 2)))))
 
;; Решение:
 
(defun task (lst)
 (let* ((n  (length lst))
        (lc (mapcar (lambda (a) (apply 'center a)) lst))
        (nc (mapcar 'cons (range 1 n) lc))
        (dc (apply 'append (mapcar (lambda (p)
                           (mapcar (lambda (q) (dist p q)) nc)) nc)))
        (dm (apply 'max (mapcar 'cadr dc)))
        (mm (remove-if (lambda (x) (> (abs (- dm (cadr x))) 0.00001)) dc)))
  (caar mm))) 
  
 
(task '((0 0 1 0 0 1) (5 5 7 6 10 11) (-2 -2 -1 -1 -6 -7)))
 
==> (2 3) ;; максимально расстояние между вторым и третьим

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

В данном коде на языке Lisp реализуется задача поиска пары треугольников, максимально удалённых друг от друга.

  1. В функции center(x1,y1,x2,y2,x3,y3) вычисляются координаты центра треугольника по формулам геометрии.
  2. В функции dist(p1,p2) вычисляется расстояние между центрами треугольников по формуле Евклида с использованием функций из библиотеки CL-Math.
  3. В функции task(lst) осуществляется решение задачи: — Создаётся список length lst, содержащий количество треугольников. — Создаётся список lc, содержащий координаты центров треугольников, вычисленные с помощью функции center и переданные в качестве аргумента каждому элементу списка lst. — Создаётся список nc, содержащий кортежи (номер треугольника, координаты центра треугольника). — Создаётся список dc, содержащий матрицу расстояний между центрами треугольников. Вычисляется с помощью функции apply 'append и mapcar (lambda (p) (mapcar (lambda (q) (dist p q)) nc)) nc). — Создаётся список dm, содержащий диагональ матрицы расстояний между центрами треугольников. Вычисляется с помощью функции apply 'max и mapcar 'cadr dc). — Создаётся список mm, содержащий только те элементы списка dm, значение которых больше заданной точности. — В результате выводится пара чисел — номер треугольника и значение из списка mm, соответствующие максимально удалённым центрам треугольников. Пример вызова функции task с тестовым списком: (task '((0 0 1 0 0 1) (5 5 7 6 10 11) (-2 -2 -1 -1 -6 -7))) Вывод: (2 3)

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


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

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

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