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