List 在Lisp列表中交换元素

List 在Lisp列表中交换元素,list,lisp,swap,List,Lisp,Swap,我正在尝试实现一个函数,该函数返回一个列表列表(列表中的每个列表都是列表中两个元素交换的结果)。它应该根据每次交换形成的列表进行搜索。这是我解决8字谜问题程序的一部分。这是我到目前为止所拥有的 (setq *LIST* nil) (defun swapped_list(lst) (loop for j in (positions_to_swap) do (setq *LIST* (rotatef (nth pos lst) (nth j lst)) *LIST*) (

我正在尝试实现一个函数,该函数返回一个列表列表(列表中的每个列表都是列表中两个元素交换的结果)。它应该根据每次交换形成的列表进行搜索。这是我解决8字谜问题程序的一部分。这是我到目前为止所拥有的

(setq *LIST* nil) 

(defun swapped_list(lst)
 (loop for j in (positions_to_swap) do
    (setq *LIST* (rotatef (nth pos lst) (nth j lst))
      *LIST*)

(swapped_list '(11 12 13 14 15 16 17 18 19))
如果
positions\u to\u swap
(0 2 5)
pos
4
,则应返回
((151213116171819)(111215413171819)(111213141416171819))

我花了无数个小时试图调试,但没有任何进展。我尝试过许多变体,但都不起作用

如果位置交换为(0 2 5)且位置为4,则应返回((15 12 13 14 11 16 17 18 19) (11 12 15 14 13 16 17 18 19) (11 12 13 14 16 (15 17 18 19))

关键在于:

CL-USER> (swap '(11 12 13 14 15 16 17 18 19) 4 '(0 2 5))
((15 12 13 14 11 16 17 18 19)
 (11 12 15 14 13 16 17 18 19)
 (11 12 13 14 16 15 17 18 19))

你是说八皇后问题吗?如果是这样的话,你会让事情变得更加困难(提示:-1-您当然知道皇后必须位于不同的行上,因此只需使用列号向量-2-开头有8个可用列,每次放置皇后时,您可以从可用列列表中删除该列-3-只有15个直接对角线(dd=x+y)你可以使用相同的逻辑-4-只有15条反对角线(cd=x+8-y),同样你可以使用相同的逻辑…)
CL-USER> (swap '(11 12 13 14 15 16 17 18 19) 4 '(0 2 5))
((15 12 13 14 11 16 17 18 19)
 (11 12 15 14 13 16 17 18 19)
 (11 12 13 14 16 15 17 18 19))