递归lisp替换元素迷宫求解器

时间:2013-06-03 15:27:19

标签: matrix replace common-lisp maze

定义矩阵后:

(setq matriz '((1 0 0 0 0 0)
               (1 1 0 0 0 0)
               (0 1 1 1 0 0)
               (0 0 0 1 0 0)
               (0 0 0 1 1 0)
               (0 0 0 0 1 1)))

我已经根据位置(行和列)创建了一个函数 但现在我想做一个功能,根据位置替换矩阵中的数字,我很难做到这一点。 让我们说我想要替换对应于1 in(0 0 0 1 0 0)的位置(3 3)我只是不知道该怎么做。 只能使用递归函数,这意味着没有循环。我正在工作的是迷宫求解器  非常感谢一些帮助谢谢:=)

:编辑部分这是我到目前为止所拥有的

(setq matriz '((1 0 0 0 0 0)(1 1 0 0 0 0)(0 1 1 1 0 0)(0 0 0 1 0 0)(0 0 0 1 1 0)(0 0 0 0 1 1)))


(defun path(i j)
           (list (list (+ i 1) j)
                 (list (- i 1) j)
                 (list i (+ j 1))
                 (list i (- j 1))
                 ))

(defun validsons (lf mat)
           (cond
            ((null lf) nil)
            ((eq (devposmat (caar lf) (cadar lf) mat) 1) (cons (car lf) (validsons (cdr lf) mat)))
            (t (validsons (cdr lf) mat))
           )
          )

(defun Devposicao(i lista)
           (cond
             ((null lista) nil)
             ((< i 0)      nil)
             ((= i 0)      (car lista))
             (t (Devposicao (- i 1) (cdr lista)))))

(defun DevPosMat(i j lista)
(Devposicao j  (Devposicao i lista)))

;显示可用路径(仅1s)

(defun rightpath(i j mat)
           (validsons (path i j) mat)
           )

;因此您可以正确地看到矩阵而不是列表

(defun writematrix(Mat)
(cond
((null Mat) nil)
(t (progn
(print (car Mat))
(writematrix (cdr Mat))))
)
 )

;这是我试图取代

的目的
(defun changenumber (i j matriz)
           (cond
            ((null matriz) nil)
            ((< i 0)      nil)
            ((= i 0)      (dec j (car matriz)))
            (t (changenumber (- i 1) j (cdr matriz)))))
(defun dec (pos l)
        (cond
         ((null l) nil)
         ((= pos 0) (cons (- (car l) 1) (cdr l)))
         (t (cons (car l) (dec (- pos 1) (cdr l))))))   

所以我能够使用正确的路径前进并看到我可以使用的路径,但我只需要编辑以前的地方我就是这样我不会继续前往我以前的位置。 对不起,如果我发布了错误的方式我不习惯这个。

2 个答案:

答案 0 :(得分:8)

不要这样做......

Common Lisp附带了多维数组,而将列表用于矩阵则很疯狂。

(defparameter *matrix*
  (make-array '(6 6)
              :element-type 'bit
              :initial-contents
              '((1 0 0 0 0 0)
                (1 1 0 0 0 0)
                (0 1 1 1 0 0)
                (0 0 0 1 0 0)
                (0 0 0 1 1 0)
                (0 0 0 0 1 1))))
(setf (aref *matrix* 3 3) 1)

(见make-array

......除非被迫

如果您需要使用疯狂教授的名单,您可以使用类似

的内容
(setf (car (nthcdr (nth matrix i) j)) 1)

(见nthnthcdr)。

如果您被禁止使用这些功能并且需要编写自己的递归设置器,请说清楚并展示您的工作(因为我们现在处于疯狂限制的范围,请同时指明您的矩阵是否应该是不可改变的。)

答案 1 :(得分:1)

(defun set-matriz-ij (matriz i j val)
  (setf (car (nthcdr j (nth i matriz))) val))

更一般地说,你应该写一个'迷宫'抽象:

(defun maze-ref (maze i j)
  (nth j (nth i maze)))

(defsetf maze-ref (maze i j) (val)
  `(setf (car (nthcdr ,j (nth ,i ,maze))) ,val))

(defun make-maze (n) ...)
(defun maze-path-at (i j)
  `((,(+ i 1) ,j)
    (,(- i 1) ,j)
     ...)))
;; etc

以上使用列表来实现抽象;矩阵可能是首选,但是一旦你完成抽象,实现就是一个非常不重​​要的细节。