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