Matrix 递归lisp替换元素迷宫解算器
定义矩阵后:Matrix 递归lisp替换元素迷宫解算器,matrix,replace,common-lisp,maze,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))) 我已经做了一个函数,可以根据位置(行和列)获取数字 但是现在我想做一个函数,根据位置替换矩阵中的一个数字,我做起来有困难。 假设我想
(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 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)))
);因此,您可以正确地看到矩阵,而不是列表
(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))))))
(定义变更编号(i j矩阵)
(续)
((空矩阵)零)
((
所以我可以使用rightpath向前移动,看看我有哪些可用的路径,但我只需要编辑以前的位置,这样我就不会继续到以前的位置。
抱歉,如果我以错误的方式发布了一些内容,我对此不习惯。不要这样做。。。
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)
(见附件)
…除非被迫
如果你被一个疯狂的教授要求使用列表,你可以使用类似
(setf (car (nthcdr (nth matrix i) j)) 1)
(见,)
如果您被禁止使用这些函数,并且需要编写自己的递归setter,请清楚地说明并展示您的工作(因为我们现在处于疯狂的限制领域,请同时指定您的矩阵是否应该是不可变的)
更一般地说,您应该编写一个“迷宫”抽象:
(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
上面使用列表来实现抽象;矩阵可能是首选,但一旦您完成了抽象,实现基本上是一个不重要的细节。您使用的是什么Lisp?Common Lisp,elisp,还有其他的吗?我正在使用Common Lisp,问题是我不能同时使用数组。。。我已经有了找到4种可能的方法(从左上到右下)的函数,但是当我尝试运行它时,它会返回,因为路径是可能的。所以我想把我经历的1改为0。如果可能的话,我希望得到一些帮助:Darray是编程中的一种基本数据类型。如果你对它们有问题,你必须仔细阅读。至于将1改为0,请使用我的答案中的
(setf aref)
。否则,答案很好。
(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