У меня есть двумерный массив целых чисел, и я хочу найти путь с наименьшей суммой от левого столбца к правому столбцу, когда возможно движение вверх, вниз и влево. Я начал с loop
всех строк и попытался построить пути в виде списков.
(defparameter *test-array*
#2A((131 673 234 103 18)
(201 96 342 965 150)
(630 803 746 422 111)
(537 699 497 121 956)
(805 732 524 37 331)))
(defun find-paths (array &aux (height (array-dimension array 0)) (width (array-dimension array 1)))
"Returns the possible paths across a given 2d array from the left column to
the right column."
(loop :for i :from 0 :below height
;; We have three ways per starting point up, left and down.
;; In the first and last row there are two ways, only.
:append (loop :for (j l) :in '((1 0) (0 1) (-1 0))
:when (and (>= (+ j i) 0) (< (+ j i) height))
:collect (list (aref array i 0) (aref array (+ i j) l))) :into paths
:finally (return paths)))
Мне было интересно, действительно ли это приведет к хорошему решению. Я боюсь, что это будет становиться все более и более сложным и занимать память, чтобы превратить весь массив в список списков, представляющих все возможные пути. Насколько я понимаю, это график, в основном. Но как я могу создать график из массива, не тратя впустую память?