use*_*436 2 replace maze common-lisp matrix
定义矩阵后:
(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))))))   
所以我能够使用正确的路径向前看,看到我有可用的路径,但我只需要编辑以前的地方我是,所以我不会继续我以前的位置.对不起,如果我发布错误的方式我不习惯这个.
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)
如果您被禁止使用这些功能并且需要编写自己的递归设置器,请说清楚并说明您的工作(因为我们现在处于疯狂限制的范围,请同时指定您的矩阵是否应该是不可变的) .