Common Lisp - Поиск в глубину

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

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

Помогите решить задачу!

Реализовать рекурсивный алгоритм поиска в глубину, выхода из лабиринта.

Решение задачи: «Common Lisp - Поиск в глубину»

textual
Листинг программы
  1. ;; Дать гнездо вершины curr
  2.  
  3. (defun get-nest (lab curr) ;; lab - это граф-лабиринт
  4.   (cond ((eq  (car lab) curr) (cadr lab))  ;; если первый элемент совпадает с текущей вершиной - вернем ее список смежности (гнездо)
  5.         (t (get-nest (cddr lab) curr))))  ;; иначе пропускаем первую вершину и ее гнездо и берем следующую
  6.  
  7. ;; Дать следующую непосещенную вершину  
  8.  
  9. (defun get-next (nest chk) ;; nest - гнездо вершины, chk-список уже посещенных вершин
  10.   (cond ((null nest) nil) ;; гнезно кончилось - все вершины гнезда уже посещались - вернем nil
  11.         ((not (member (car nest) chk)) (car nest)) ;; первый элемент гнезда еще не посещался - вернем его
  12.         (t (get-next (cdr nest) chk)))) ;; иначе применим алгоритм к гнезду без первого эл-та
  13.  
  14. ;; Собственно, обход в глубину
  15. ;; lab - граф-лабиринт
  16. ;; curr - текущая (стартовая) вершина
  17. ;; targ - целевая вершина
  18. ;; path - путь (результат)
  19. ;; chk  - список посещенных        
  20.  
  21. (defun dfs (lab curr targ &optional (path (list curr)) (chk (list curr)))
  22.   (cond ((eq curr targ) (reverse path)) ;; если текущая = целевой - конец. вернем путь
  23.         (t (let* ((nest (get-nest lab curr)) ;; гнездо текущей
  24.                   (next (get-next nest chk))) ;; первый непосещенный гнезда
  25.                  (if next (dfs lab next targ (cons next path) (cons next chk)) ;; если в гнезде есть непосещенный - идем в него
  26.                           (dfs lab (cadr path) targ (cdr path) chk)))))) ;; иначе "отстегиваем" голову path

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


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

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

6   голосов , оценка 4.5 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут