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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д