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

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

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

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

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

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

textual
Листинг программы
;; Дать гнездо вершины curr
 
(defun get-nest (lab curr) ;; lab - это граф-лабиринт
  (cond ((eq  (car lab) curr) (cadr lab))  ;; если первый элемент совпадает с текущей вершиной - вернем ее список смежности (гнездо)
        (t (get-nest (cddr lab) curr))))  ;; иначе пропускаем первую вершину и ее гнездо и берем следующую
  
;; Дать следующую непосещенную вершину  
  
(defun get-next (nest chk) ;; nest - гнездо вершины, chk-список уже посещенных вершин
  (cond ((null nest) nil) ;; гнезно кончилось - все вершины гнезда уже посещались - вернем nil
        ((not (member (car nest) chk)) (car nest)) ;; первый элемент гнезда еще не посещался - вернем его
        (t (get-next (cdr nest) chk)))) ;; иначе применим алгоритм к гнезду без первого эл-та
 
;; Собственно, обход в глубину
;; lab - граф-лабиринт
;; curr - текущая (стартовая) вершина
;; targ - целевая вершина
;; path - путь (результат)
;; chk  - список посещенных        
 
(defun dfs (lab curr targ &optional (path (list curr)) (chk (list curr)))
  (cond ((eq curr targ) (reverse path)) ;; если текущая = целевой - конец. вернем путь
        (t (let* ((nest (get-nest lab curr)) ;; гнездо текущей
                  (next (get-next nest chk))) ;; первый непосещенный гнезда
                 (if next (dfs lab next targ (cons next path) (cons next chk)) ;; если в гнезде есть непосещенный - идем в него
                          (dfs lab (cadr path) targ (cdr path) chk)))))) ;; иначе "отстегиваем" голову path

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


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

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

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